2015-12-23 1 views
0

Итак, я был на последнем Laravel 5.1 и обновлен до 5.2 сегодня. В моих маршрутов у меня есть что-то вроде этого:Laravel 5.2 - Обновленная и маршрутная группа промежуточного программного обеспечения теперь больше не называется

Route::group(['middleware' => ['api']], function() { 
    // Members 
    Route::get('members', '{api-namespace}\[email protected]'); 
    Route::get('member/{id}', '{api-namespace}\[email protected]'); 

    // Members Pension 
    Route::get('member/{id}/pension/beneficiaries', '{api-namespace}\Inquiry\[email protected]'); 
    Route::get('member/{id}/pension/contributions', '{api-namespace}\Inquiry\[email protected]'); 
    Route::get('member/{id}/pension/yearlySummary', '{api-namespace}\Inquiry\[email protected]'); 
    Route::get('member/{id}/pension/pensioners', '{api-namespace}\Inquiry\[email protected]'); 

    // Members Summary 
    Route::get('member/{id}/beneficiaries/{fund?}', '{api-namespace}\[email protected]'); 
    Route::get('member/{id}/contributions/', '{api-namespace}\[email protected]'); 

    // Beneficiaries 
    Route::get('beneficiaries', '{api-namespace}\[email protected]'); 
    Route::get('beneficiary/{id}', '{api-namespace}\[email protected]'); 

    // Contributions 
    Route::get('contributions', '{api-namespace}\[email protected]'); 

    Route::get('users', '{api-namespace}\[email protected]'); 
}); 

АНИ-версия промежуточного слоя в основном проверяет заголовок для Апи-версии, а затем заполняет {апи-имен} в действиях маршрут соответствующим образом. Это прекрасно работает в 5.1. Тем не менее, с момента обновления я получаю Class App\\Http\\Controllers\\{api-namespace}\\MembersController does not exist, и он даже не попадает в мое промежуточное ПО. У меня возникло ощущение, что они, возможно, изменили порядок кода, чтобы он проверял действия маршрута перед запуском промежуточного программного обеспечения, потому что, если я поместил промежуточное ПО во всем мире, он отлично работает. Тем не менее, мне нужна эта группа api-версий, поэтому, если у кого-нибудь есть идеи, как обойти это, я все уши.

По запросу:

Kernel.php

<?php 

namespace App\Http; 

use Illuminate\Foundation\Http\Kernel as HttpKernel; 

class Kernel extends HttpKernel 
{ 
    /** 
    * The application's global HTTP middleware stack. 
    * 
    * @var array 
    */ 
    protected $middleware = [ 
     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
     \App\Http\Middleware\EncryptCookies::class, 
     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
     \Illuminate\Session\Middleware\StartSession::class, 
     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
    ]; 

    /** 
    * The application's route middleware. 
    * 
    * @var array 
    */ 
    protected $routeMiddleware = [ 
     'auth' => \App\Http\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
     'api-version' => \App\Http\Middleware\ApiVersionMiddleware::class, 
    ]; 

    /** 
    * The application's route middleware groups. 
    * 
    * @var array 
    */ 
    protected $middlewareGroups = [ 
     'web' => [ 
      \App\Http\Middleware\EncryptCookies::class, 
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
      \Illuminate\Session\Middleware\StartSession::class, 
      \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
      \App\Http\Middleware\VerifyCsrfToken::class, 
     ], 
     'api' => [ 
      'throttle:60,1', 
      'api-version', 
      'cors' 
     ], 
    ]; 
} 

ApiVersionMiddleware.php

<?php namespace App\Http\Middleware; 

use Closure; 
use Jbm\Exceptions\ApiVersionException; 
use Jbm\Helpers\ApiVersion; 

class ApiVersionMiddleware 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     $route = $request->route(); 
     $actions = $route->getAction(); 

     $requestedApiVersion = ApiVersion::get($request); 
     if (!ApiVersion::isValid($requestedApiVersion)) { 
      throw new ApiVersionException('Invalid API Version'); 
     } 

     $apiNamespace = ApiVersion::getNamespace($requestedApiVersion); 

     $actions['uses'] = str_replace(
      '{api-namespace}', $apiNamespace, $actions['uses'] 
     ); 

     $route->setAction($actions); 

     return $next($request); 
    } 
} 

заметить также, что я переместил промежуточное программное обеспечение в группу промежуточного слоя и его до сих пор не работает. Просто FYI

Update:

Я попытался двигаться к промежуточному к глобальным, но в тот момент она имеет 0 информацию о маршруте, что означает, что он не может изменить маршрут, чтобы заменить {api-namespace}. Я считаю, что проблема заключается в том, что маршрут «использует» проверяется до того, как на него запускается промежуточное ПО, которое явно не работает. Может ли кто-нибудь подтвердить это и/или показать мне, как я буду реализовывать что-то подобное в 5.2?

Update 2:

Так я обнаружил проблему. В Illuminate/Routing/Router.php:834 маршрутизатор пытается заменить неявные привязки. Это происходит до ПО промежуточного слоя и проверяет маршрут для действительных «использования». У меня есть идея, как обойти это, поскольку он полностью сдувает то, что я сейчас делаю. Какие-либо предложения?

+0

Это, вероятно, что-то делать с Laravel 5.2 пытается автоматически вводить модели/классы в контроллер звонки. См. Раздел «Неявная привязка модели» в [Замечания по выпуску Laravel 5.2] (https://laravel.com/docs/5.2/releases#laravel-5.2) – samlev

+0

im действительно думает, что это имеет отношение к этому: https: // mattstauffer.co/blog/middleware-groups-in-laravel-5-2. Они создали группы промежуточного программного обеспечения, а синтаксис для вызова групп промежуточного программного обеспечения - это то же самое, что и раньше, чтобы привязать промежуточное программное обеспечение к группе маршрутов ... так что, вероятно, это противоречиво. Перейти к тесту –

+0

Сообщение об ошибке означает, что оно пытается привязываться к модели на основе вашего пути, но не может найти модель – samlev

ответ

Смежные вопросы

 Смежные вопросы