Laravel中间件不会在每个请求之前运行

时间:2018-11-03 13:59:05

标签: php laravel middleware

我有这个简单的中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Session;
use App;

class SetPageLanguage
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if(Session::has('language'))
        {
            $lang = Session::get('language');

            App::setLocale($lang); // still don't know which one to use, but I'll figure it out ;)
            app()->setLocale($lang);
        }

        return $next($request);
    }
}

哪个应该在每个请求之前运行。所以我将其添加到内核中:

class Kernel extends HttpKernel
{

    protected $middleware = [

        ...

        \App\Http\Middleware\SetPageLanguage::class, // middleware for setting the language when loading a page
    ];

但是它不起作用。它永远不会运行。

另一方面,如果我将其放入routeMiddleware中,就像这样:

 protected $routeMiddleware = [

        ...

        'localization' => \App\Http\Middleware\SetPageLanguage::class,

        ...

并在每条路线上调用它,例如:

Route::GET('/', 'AnonymController@home')->middleware('localization');

它完美地工作!但我不想这样做。我希望它像预期的那样在每个请求之前自动运行。 我想念什么?

我对laravel和Php很陌生,所以我确定我不了解重要的东西。

我看了一些教程,阅读了几篇文章,并在Stack Overflow上搜索了答案。仍然无法弄清楚。

如何使我的中间件在每个请求之前运行?

谢谢。

1 个答案:

答案 0 :(得分:3)

它可能正在运行,但是全局中间件在路由中间件之前运行。了解其他中间件在做什么以及它们被调用的顺序很重要。

如果您查看'web'中间件组,则会看到以下中间件:

\Illuminate\Session\Middleware\StartSession::class,

Laravel应用程序中无法立即提供会话。 StartSession中间件是启动Web路由会话的工具。 API路由不使用会话,因为它们是无状态的。

因此,此中间件可能依赖于会话数据,因此可能属于会话中间件下方的Web组。