关于队列序列化Model后,original字段变为新值的问题
我在监听模型的updating
和updated
事件,并在事件中投递了一个队列任务,是异步的。在监听器中打印模型,original
字段与attributes
不一致,并且changes
字段存有变更的键值,这是正常的。但是,在异步执行时,打印模型,结果original
字段与attributes
字段一致,changes
字段也空了。这是哪里的问题?
BaseModel监听器
<?php
namespace App\Observers;
use App\Models\BaseModel;
use App\Jobs\MyJob;
class BaseModelObserver
{
public function updated(BaseModel $baseModel)
{
// 这里打印模型,结果中模型属性 attributes 和 original 两个字段会有不同的值
// 并且 changes 字段会存有 attributes 和 original 中不一致的键值
// dd($baseModel)
MyJob::dispatch($baseModel);
}
}
MyJob队列任务
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Models\BaseModel;
class ManagerActionDetailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $model;
public function __construct(BaseModel $model)
{
$this->model = $model;
}
public function handle()
{
// 任务中打印模型,结果中模型属性 attributes 和 original 两个字段完全相同,且都是更新后的值
// changes 字段也为空了
dd($this->model);
}
}
问题:
这是因为
SerializesModels
,它会把对应的job中的QueueableCollection
和QueueableEntity
类型的对象序列化时进行简化,以压缩job的payload,而Model
类也实现了QueueableEntity
这个接口,至于怎么解决,恐怕只有自己写个中间类中转一下了,或者把所需要的字段拿出来也塞进job里做额外的处理。