【问题标题】:Using session in custom middleware in laravel在 laravel 的自定义中间件中使用会话
【发布时间】:2017-07-27 21:53:23
【问题描述】:

我有一个简单的中间件,可以检查用户会话中是否有密钥。

<?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

【问题讨论】:

  • 将你的中间件移到web中间件组和SessionStart中间件之后。
  • 虽然这行得通,但它会将其附加到所有请求中,我设法做到了
  • 在它附加到所有请求之前设置它的方式,所以我认为这就是你需要的。如果您不希望这样,请在 $routeMiddleware 中按名称声明它并正常使用它(在这种情况下,Web 中间件已经运行)
  • 谢谢,介意将此作为答案,以便我将其标记为“最佳答案”吗?

标签: php session laravel-5 laravel-5.3


【解决方案1】:

L5 中间件由 3 种“类型”组成。

配置位于Kernel.php 文件中用于 HTTP 请求(通常为 App\Http\Kernel。全局中间件将为所有请求运行并在 $middleware 中声明,路由组中间件将为所有请求运行对于给定的路由组并在$middlewareGroups 中声明,默认情况下,在web.php 中声明的所有路由都被视为web 路由,因此所有Web 中间件都适用。

第三种是路由中间件。这些在$routeMiddleware 数组中以"middlewareName" =&gt; Middleware::class 的形式声明,并且可以在任何路由中使用,例如

Route::get("/route", function () { /* route body */ })->middleware("middlewareName");

这些按全局 > 组 > 路由中间件的顺序运行,SessionStart 中间件作为组中间件的一部分运行。任何其他需要访问会话的中间件都需要放在SessionStart 中间件之后。

澄清

在重新阅读本文时,这意味着您需要在$middeware 变量中声明中间件才能使用它们。不是这样的,下面的语法也是允许的:

Route::get("/route", function () { 
   /* route body */ 
})->middleware(Middleware::class);

但是,当您使用中间件时,此语法不允许您向中间件提供参数,例如,当您使用 auth:api 时使用身份验证中间件(其中 api 将是传递给中间件的参数)。

【讨论】:

  • 谢谢@apokryfos。你救了我。
猜你喜欢
  • 2016-12-21
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2018-09-12
  • 2017-09-25
  • 2021-05-22
相关资源
最近更新 更多