首页 > 解决方案 > Laravel 5.6 - 在没有中间件的情况下在控制器外部获取经过身份验证的用户

问题描述

长标题。我有一个可以在任意点初始化的单例。它可能在控制器的构造函数期间被调用,这使得我不能使用 auth 中间件,因为它可能没有被构建。

我需要从某个地方获取用户,但我找不到办法。会话、请求或中间件不保证存在或被初始化。我检查了门面,什么也没有。

我确信有办法解决它。也许别人比我更足智多谋。

标签: phplaravel

解决方案


跟踪代码后,问题如下:

控制器通过路由器流水线化,顺序如下:

-> 运行控制器 __construct()

->然后将其通过管道并按重要性顺序运行中间件

-> 然后执行其他操作(即调用 index() 或路由想要的任何入口点)

中间件是处理会话、请求和身份验证等...所有中间件在控制器 __construct 和入口点之间运行。

因此,在控制器中,如果您要执行以下操作:

__construct() {
    $this->middleware(function(Request $request, $next) {
       echo 'step 1';
    });

    echo 'step 2';

}

public function index() { echo 'step 3'; }

你会得到:

第 2 步 <--- 在 __construct 范围内(中间件回调中定义的任何内容在此处均不可用)。

第 1 步 <-- 在 __construct 范围之外(但在 index() 范围之前)

步骤 3 <-- 内部索引,步骤 1 中定义的任何内容都可以在此处获得。

因此,任何需要这些的东西都保证在入口点函数中需要它之前存在,但不在构造函数中,除非放在中间件回调中。所以你能做的最好的就是在“中间”运行代码。最后,在您需要时提供它。这里有一个限制,你可以绕过它,但这很烦人。

在此之前我找不到获取用户会话的方法,我假设您必须从 redis 读取它并以某种方式自行解决它,因为 laravel 对象尚未填充,因为它在管道中为时过早。


推荐阅读