php - Laravel 5.6 - 在没有中间件的情况下在控制器外部获取经过身份验证的用户
问题描述
长标题。我有一个可以在任意点初始化的单例。它可能在控制器的构造函数期间被调用,这使得我不能使用 auth 中间件,因为它可能没有被构建。
我需要从某个地方获取用户,但我找不到办法。会话、请求或中间件不保证存在或被初始化。我检查了门面,什么也没有。
我确信有办法解决它。也许别人比我更足智多谋。
解决方案
跟踪代码后,问题如下:
控制器通过路由器流水线化,顺序如下:
-> 运行控制器 __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 对象尚未填充,因为它在管道中为时过早。
推荐阅读
- python - 我可以从 Python 3 中的单行字符串中一个一个地读取数字吗?
- python - 使用 {% elif %} 时这个 Jinja 模板有什么问题
- python - 尝试在没有 numpy 的情况下将熊猫添加到 aws lambda
- python - 基于 1 个条件使用 Python 查找 Excel 行的问题
- sql - 控制在 SQL Server Order by 子句中指示排序的字符
- shopify - 无法获取 Shopify 在线访问令牌
- arrays - 在一列中查找名称,从另一列返回值
- c# - 我在按住鼠标左键时无法正确播放正确的粒子效果
- node.js - 如何使用来自服务器的节点 js rest api 保存图像
- python - 如何确保 Python qt 应用程序在所有操作系统上都是屏幕可读的