中间件优先级不适用于Laravel 5.5

时间:2018-03-22 16:18:48

标签: php laravel laravel-5

我坚持一些我非常确定非常基本的东西..但不知怎的,我无法让它发挥作用。

我根据用户的选择创建了一个中间件来设置我的网站的区域设置(他的选择是在'locale'列下的数据库中注册的)。我所做的是我检查用户是否登录,如果他是我使用他的语言环境,如果不是我默认为英语。

出于某种原因,我的中间件永远不会“看到”用户登录并始终默认为英语。我将Auth :: check()的结果输出到日志中,实际上这总是返回false,即使用户实际已登录。

我认为这与在Auth之前执行的这个中间件有关。我试图改变内核文件中的优先级但是仍然无法工作..任何想法?

我的中间件

namespace App\Http\Middleware;

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

class SetLocale {

    public function handle($request, Closure $next) {

      if(Auth::check()) {
        $locale = Auth::user()->locale;
      } else {
        $locale = 'en';
      }
      \App::setLocale($locale);
      return $next($request);
    }
}

我的路线('auth'是默认的auth中间件,'checkProjectPermission:read'检查登录的用户是否有权访问此项目)

Route::prefix('client')->middleware(['auth','checkRoomPermission:read'])->group(function() {
    Route::get('{project_id}/checklist', 'ProjectController@accessChecklist')->name('checklist');
}

My Kernel.php文件:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\SetLocale::class
];

protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \Illuminate\Auth\Middleware\Authenticate::class,
    \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
    \App\Http\Middleware\SetLocale::class
];

由于

1 个答案:

答案 0 :(得分:1)

问题是您正在向全局中间件添加SetLocaleglobal中间件不start a session,因此您无权访问基于会话的数据 - 例如用户。

如果您查看laravel提供的web中间件(为简洁起见而清理)

protected $middlewareGroups = [
    'web' => [
        EncryptCookies::class,
        AddQueuedCookiesToResponse::class,
        CreateFreshApiToken::class,
        StartSession::class,
        ShareErrorsFromSession::class,
        VerifyCsrfToken::class,
        SubstituteBindings::class
    ]
]

您将了解为什么添加到web中间件的任何中间件都可以访问auth类,因为它会注入StartSession

如果您想访问基于会话的数据,那么您需要确保StartSession已启动。

不要只需将StartSession添加到您的全球中间件,否则您将度过难关。相反,请将其添加到auth中间件,然后在SetLocale之后添加StartSession

修改

请注意,如果您正在使用Web Middleware,则必须同时向SetLocale添加Middleware Group

优先级仅为nsort,根据middleware数组中存在的中间件重新排序应用于当前请求的middlewarePriority

简化:如果中间件不在路由请求的中间件组中,则中间件优先级无效。