队列传参问题
今天遇到一个问题,请各位大佬给我答疑解惑
$user = app(User::class)->first();
$user->uid = 123;
dispatch(new UserJob($user)); //调用队列
class UserJob extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $tries = 2;
public $user;
public function __construct($user)
{
$this->user = $user;
dump($this->user);
}
public function handle()
{
dd($this->user);
}
第一个dump打印的是我赋值后的值
而在 handle 里再dd() 的时候 uid 又变回原本的值了
这个为啥呀? 队列对这个对象参数做了什么操作?
再讲一个 job 放进 Laravel 队列时,Laravel 会将改 job Serialize 化,期间会丢失非 public 的数据,这也是为什么设置的 payload 数据要设置为 public 的原因。
说回来,Laravel 在消费队列数据时,会尝试先 unSerialize,如果 payload 是 model,Laravel 还会尝试根据 id 重新查询一次数据库,并用新纪录填充 $user。
所有你在 job 里 __contruct 看到的数据是调用时你传给他的,而 handl 里的是重新反查出来的。