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

Dey*_*iev 3 php session laravel-5 laravel-5.3

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

<?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');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我总是收到“未按请求设置会话存储”。错误。这是我的路线:

Route::get('home', function () {
        return view('home');
    })->middleware('web', 'CustomAuth');
Run Code Online (Sandbox Code Playgroud)

我在变量 $middleware 中添加了 app\Http\Kernel.php 中的中间件

protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\CustomAuth::class
    ];
Run Code Online (Sandbox Code Playgroud)

我也尝试改变我的路线:

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

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

apo*_*fos 5

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

该配置中找到Kernel.php文件HTTP请求(通常App\Http\Kernel,有全球中间件将所有请求运行,并在被声明$middleware,还有的航线组中间件将针对给定路由组中的所有请求运行,并在被声明$middlewareGroups,默认情况下所有在 inweb.php中声明的路由都被认为是web路由,所以所有的 web 中间件都适用。

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

Route::get("/route", function () { /* route body */ })->middleware("middlewareName");
Run Code Online (Sandbox Code Playgroud)

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

澄清

当重新阅读本文时,这意味着您需要在$middeware变量中声明中间件才能使用它们。事实并非如此,还允许使用以下语法:

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

Run Code Online (Sandbox Code Playgroud)

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