我是一个简单的中间件,用于检查用户会话中是否有密钥。
<?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');
}
}
}
问题是我总是得到#34;会话存储不是根据请求设置的。&#34;错误。这是我的路线:
Route::get('home', function () {
return view('home');
})->middleware('web', 'CustomAuth');
我在app \ Http \ Kernel.php中添加了变量$ middleware中的中间件
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
答案 0 :(得分:2)
L5中间件由3种“类型”组成。
配置可以在Kernel.php
文件中找到HTTP请求(通常为App\Http\Kernel
。有全局中间件可以运行所有请求并在$middleware
中声明,有路由组中间件它将针对给定路由组的所有请求运行并在$middlewareGroups
中声明,默认情况下,web.php
中声明的所有路由都被视为web
路由,因此所有Web中间件都适用。< / p>
第三种类型是路由中间件。这些在$routeMiddleware
数组中以"middlewareName" => Middleware::class
的形式声明,并且可以在任何路径中使用,例如。
Route::get("/route", function () { /* route body */ })->middleware("middlewareName");
这些按顺序运行&gt;组&gt;路由中间件和SessionStart
中间件作为组中间件的一部分运行。需要访问会话的任何其他中间件都需要放在SessionStart
中间件之后。