Laravel 5.3 中间件守卫不工作

Laravel 5.3 middleware guard not working

最近我从 Laravel 5.2 升级到 Laravel 5.3 之后我发现我创建的用于设置用户语言的 Localization 中间件停止工作,而不是确定为什么?

我正在使用基于 tokenauthentication

中间件如下:

<?php namespace App\Http\Middleware;

use Closure;
use PhpSpec\Exception\Exception;
use Illuminate\Support\Facades\Auth;


class Localization {

    public function handle($request, Closure $next, $guard = null)
    {
       if(!Auth::guard()->guest())
       {
            if(!session('current_locale'))  {
                $localecode = Auth::guard($guard)->user()->getLocale();
                session('current_locale',empty ($localecode) ? 'en' : $localecode);
                \App::setLocale($localecode);
            }else{
                \App::setLocale(session('current_locale'));
            }
       }
        return $next($request);
    }

}

而我的 routes/api.php 是:

Route::group(['prefix' => 'api/service/v1', 'middleware' => ['api'], 'guard' => 'api'], function(){
    Route::get("someUrlHere","SomeControler@SomeMethod");
    Route::group(['middleware' => ['auth:api','localization','beforeMiddleware', 'afterApiCallMiddleware'], 'guard' => 'api'], function() {
        Route::get("SomeOtherUrlHere","SomeOtherControler@SomeOtherMethod");
    });
});

config/auth.php 为:

<?php

return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
];

app/Http/Kernal.php 为:

<?php namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,  
        'Barryvdh\Cors\HandleCors',

    ];

    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,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    protected $routeMiddleware = [
        'auth' => 'App\Http\Middleware\Authenticate',
        'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',     
        'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'localization'=>'App\Http\Middleware\Localization',
        'afterMiddleware' => 'App\Http\Middleware\AfterMiddleware',
        'beforeMiddleware' => 'App\Http\Middleware\BeforeMiddleware',
        'afterApiCallMiddleware' => 'App\Http\Middleware\AfterApiCall',
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ];

}

每次调用方法时,我都发现 $guardLocalization 中间件的 handle() 方法中为空。

因为 $guard 是中间件中的附加参数,您必须手动传递它。您应该能够通过更改 Route::group 中间件数组中的值来做到这一点:

'localization'

至:

'localization:api'

希望对您有所帮助!