【问题标题】:Laravel 5.2 web middleware group in routes.php is goneroutes.php 中的 Laravel 5.2 Web 中间件组不见了
【发布时间】:2016-11-23 07:26:09
【问题描述】:

我最近开始了一个新的laravel项目,发现routes.php中的web中间件组不见了。

它似乎仍然在使用它——因此我想问一下它是在哪里配置的,因为它没有在 Kernel.php 中作为默认中间件列出

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \GeneaLabs\LaravelCaffeine\Http\Middleware\LaravelCaffeineDripMiddleware::class,
];

我实际上是在问,因为我想为我的应用创建一个附加 api,因此我想使用网络中间件。

【问题讨论】:

    标签: php laravel laravel-5.2 middleware


    【解决方案1】:

    你在看哪里?在默认的Kernel.php 上,这些仍然存在:

        /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];
    
    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    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,
        ],
    
        'api' => [
            'throttle:60,1',
        ],
    ];
    

    那么在你的routes 中连默认的web 都不存在,那就放吧。

    Route::group(['middleware' => ['web']],function(){
          //your routes ...
    });
    

    或者,如果您不希望 api 端点中的会话:

    Route::group(['middleware' => ['api']],function(){
          //your routes ...
    });
    

    【讨论】:

    • 我无法验证这一点。我的 routes.php 中没有 Route::group 中间件,但如果我添加了我的令牌,仍然会得到 TokenMismatchException - 因此似乎附加了 Web 中间件而没有实际附加它
    • 当然,我的内核中确实定义了 Web 中间件——这不是问题,但它没有在每个请求调用的默认中间件中定义——因此我想知道为什么它仍在使用
    • 是的,在 routes.php 中默认没有路由组,这就是为什么您需要根据自己的喜好添加中间件的原因。如果您不需要会话等,只需附加中间件“api”值即可!
    • 仍然不能同意这一点 - 请参考我给出的答案。 Web中间件隐式应用在RouteServiceProvider中
    • 从 Laravel 5.2.27 开始,自动应用 web 中间件组。您不再需要在您的路线文件中使用它。该框架在幕后应用它
    【解决方案2】:

    实际上我自己找到了答案。这种行为的根源在于 RouteServiceProvider,其中 map 函数应用了中间件。

    /**
     * Define the routes for the application.
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    public function map(Router $router)
    {
        $this->mapWebRoutes($router);
    
        //
    }
    
    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @param  \Illuminate\Routing\Router  $router
     * @return void
     */
    protected function mapWebRoutes(Router $router)
    {
        $router->group([
            'namespace' => $this->namespace, 'middleware' => 'web',
        ], function ($router) {
            require app_path('Http/routes.php');
        });
    }
    

    【讨论】:

    • 这让我头疼了好几个小时。我真的不喜欢这个决定。
    • 我实际上以某种方式记得它是在 laracast 中呈现的,但不记得在哪里 :) - 我非常喜欢它,因为你清理了你的 routes.php,现在只需创建类似 routes-api 的东西.php 并在 mapWebRoutes 中引用它。无需将 api Routes 与应用程序路由混合在一个文件中
    猜你喜欢
    • 2016-09-01
    • 2018-01-21
    • 2018-06-28
    • 2017-07-23
    • 1970-01-01
    • 2017-03-15
    • 2016-07-14
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多