代码之家  ›  专栏  ›  技术社区  ›  Luís Henriques

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

  •  0
  • Luís Henriques  · 技术社区  · 6 年前

    我有一个简单的中间件

    <?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
        ];
    

     protected $routeMiddleware = [
    
            ...
    
            'localization' => \App\Http\Middleware\SetPageLanguage::class,
    
            ...
    

    在每一条路线上都打电话,比如:

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

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

    如何在每次请求之前运行中间件?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Devon Bessemer    6 年前

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

    'web' 中间件组,您将看到以下中间件:

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

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