在 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
将是一个参数传递给中间件)。
我有一个简单的中间件,它检查用户会话中是否有密钥。
<?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
将是一个参数传递给中间件)。