在一个 laravel 5.8 应用程序中,在处理队列中的任务时,需要获取经过身份验证的用户 auth()->user(),队列启动时该用户不存在(null)。
细节:
1 用户通过调用 Import\ImportController@init 方法启动导入过程;
2 该方法对传入的import.csv文件进行检查和解析,每行一个行处理任务入队列;任务是资源密集型的,因为 执行图像处理:调整大小和水印;
3 在文件处理结束时,给用户一个关于将任务放入队列成功的消息;
4 对任务中的图像进行处理后,模型保存到数据库中;
5 在观察者的create()方法中保存模型的过程中,调用了setCreator()方法,使用auth()助手设置creator_id参数:
/**
* set setCreator from auth user
*
* @return $this
*/
public function setCreator(): self
{
$this->creator_id = auth()->user();
return $this;
}
6 当然,可以使用 ModelController@store 方法保存模型 - 帮助器可以正常工作。
7 细节有些简化,将当前用户转移到任务对我来说似乎是不必要的麻烦。此刻,我拄拐杖:在日志中注册了queuing,并且creator_id设置为system_user,但是客户宣布这个字段应该包含导入发起者的id。
在测试中可以使用$this->actingAs($user),但是如何解决队列中的问题呢?
有没有办法从特定用户的队列中运行任务?
您可以轻松地将用户 ID 传递给队列,并且已经在队列本身中从存储库中获取用户。或者传递用户模型本身,在这里如你所愿
非常感谢所有回复的人,但不幸的是,提议的选项只能解决问题的一小部分。完全解决问题是不可能的。问题已关闭
在手册中找到了解决方案(多么出乎意料!)。
确实有一点不同:
队列不是代表用户启动的,而是直接在执行 handle() 方法时,通过传递的 id 对所需用户进行身份验证:
但是,从问题的描述来看,这是必需的。
我希望它对某人有用。