在 laravel 的自定义中间件中使用会话

Using session in custom middleware in laravel

我有一个简单的中间件,它检查用户会话中是否有密钥。

<?php

namespace App\Http\Middleware;

use Closure;

class CustomAuth
{
    public function handle($request, Closure $next)
    {
        if($request->session()->has('uid')){
            return $next($request);
        }
        else{
            return view('unauth');
        }
    }
}

问题是我总是得到 "Session store not set on request." 错误。这是我的路线:

Route::get('home', function () {
        return view('home');
    })->middleware('web', 'CustomAuth');

我已经在变量 $middleware

中添加了 app\Http\Kernel.php 中的中间件
protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\CustomAuth::class
    ];

我也试过把我的路线改成这样:

Route::group(['middleware' => ['web']], function () {
    Route::get('home', function () {
        return view('home');
    })->middleware('CustomAuth');
});

但这没有用。知道如何确保会话已经开始,或者在调用中间件之前启动它吗?我正在使用 Laravel 5.3

L5 中间件由 3 个“类型”组成。

可在 Kernel.php 文件中找到 HTTP 请求的配置(通常为 App\Http\Kernel。全局中间件将为所有请求 运行 并在 $middleware 中声明,有一个路由组中间件,它将 运行 用于给定路由组的所有请求,并在 $middlewareGroups 中声明,默认情况下,在 web.php 中声明的所有路由都被认为是 web 路由以便应用所有网络中间件。

第三种是路由中间件。这些在 $routeMiddleware 数组中以 "middlewareName" => Middleware::class 的形式声明,可以在任何路由中使用,例如

Route::get("/route", function () { /* route body */ })->middleware("middlewareName");

这些 运行 顺序为 global > group > route 中间件和 SessionStart 中间件 运行 作为组中间件的一部分。任何其他需要访问会话的中间件都需要放在 SessionStart 中间件之后。

澄清

重新阅读时发现这意味着您需要在 $middeware 变量中声明中间件才能使用它们。不是这样的,下面的语法也是允许的:

Route::get("/route", function () { 
   /* route body */ 
})->middleware(Middleware::class);

但是,当您使用中间件时,此语法不允许您向中间件提供参数,例如,当您使用身份验证中间件时 auth:api(其中 api 将是一个参数传递给中间件)。