我有一个简单的中间件来检查用户会话中是否有密钥。
<?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');
}
}
}
问题是我总是收到“未根据请求设置会话存储”。错误。这是我的路线:
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");
它们按照全局>组>路由中间件的顺序运行,SessionStart
中间件作为组中间件的一部分运行。任何其他需要访问会话的中间件都需要放置在SessionStart
中间件。
澄清
当重新阅读本文时,这意味着您需要在$middeware
变量来使用它们。事实并非如此,以下语法也是允许的:
Route::get("/route", function () {
/* route body */
})->middleware(Middleware::class);
但是,此语法不允许您在使用中间件时向中间件提供参数,就像使用身份验证中间件时那样auth:api
(where api
将是传递给中间件的参数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)