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

时间:2017-03-07 15:47:49

标签: 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');
        }
    }
}

问题是我总是得到#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

1 个答案:

答案 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中间件之后。