【问题标题】:Laravel middleware won't run before every requestLaravel 中间件不会在每个请求之前运行
【发布时间】:2019-04-07 11:49:06
【问题描述】:

我有这个简单的中间件

<?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 上搜索了答案。还是想不通。

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

谢谢。

【问题讨论】:

    标签: php laravel middleware


    【解决方案1】:

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

    如果您查看'web' 中间件组,您会看到这个中间件:

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

    会话不会立即在 Laravel 应用中可用。 StartSession 中间件是为 Web 路由启动会话的东西。 API 路由不使用会话,因为它们是无状态的。

    因此,这个中间件很可能属于会话中间件下面的网络组,因为它依赖于会话数据。

    【讨论】:

    • 所以你的意思是他们按照他们呈现的顺序运行?首先是中间件,然后是中间件组,然后是路由中间件?很高兴知道。我将它添加到 web 组的底部,在中间件组中,在 StartSession 之后。它现在完美运行。谢谢。
    • 是的,它们就是这样运行的,但是中间件组和路由中间件不是全局的,它们依赖于路由定义。 routes/web.php 中的任何路由都将使用 web 组。然后路由中间件是特定于路由的。所以中间件是在全局级别、组级别和路由级别定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多