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
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将传递给中间件的参数在哪里)。