Laravel队列Job如何在handle方法中获取控制器分发的请求数据
实现方法
1. 改造ClientJob类的属性与构造函数
Laravel队列任务在序列化存储到队列时,会持久化类的实例属性,因此需要将分发时传入的请求数据显式挂载为类的实例属性,才能在异步执行时正常读取。
ClientJob类的核心结构参考:
namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class ClientJob implements ShouldQueue { use Dispatchable, Queueable; // 定义实例属性存储请求数据,推荐使用public减少额外方法调用 public $requestData; // 构造函数接收dispatch方法传入的参数 public function __construct(array $requestAllData) { // 将传入的请求数据赋值给类属性,供handle方法调用 $this->requestData = $requestAllData; } }
2. 在handle方法中直接读取属性
队列任务反序列化执行时,类的实例属性会被完整还原,因此直接在handle方法中调用对应属性即可拿到之前分发的请求数据,修改后的handle方法如下:
public function handle() { // 直接获取之前分发传入的所有请求数据 $request = $this->requestData; // 后续业务逻辑可直接使用该$request变量 }
关键注意事项
- 禁止直接将整个
Request实例传入队列任务:Request对象依赖运行时的HTTP请求上下文,队列是脱离HTTP环境异步执行的,传入完整Request对象会触发序列化失败、数据丢失的问题,你当前分发时传$request->all()的写法是符合最佳实践的- 不要将需要跨队列生命周期的参数仅作为构造函数的临时变量,必须显式赋值给类的实例属性(public/protected均可),否则序列化过程中会被丢弃
- 如果需要在handle中使用Request类的便捷方法(如
input()、only()),可以将拿到的数组通过request()->merge($this->requestData)注入当前运行上下文,无需存储完整Request对象
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

