关于队列序列化Model后,original字段变为新值的问题

我在监听模型的 updatingupdated 事件,并在事件中投递了一个队列任务,是异步的。在监听器中打印模型,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);
    }
}

问题:

  • 为什么队列中打印结果和监听器中不一致?#

  • 如果我需要队列中保持 originalchanges 字段,怎么解决?#

再见了妈妈今晚我就要远航,别为我担心我有快乐和智慧的桨~
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

这是因为 SerializesModels,它会把对应的 job 中的 QueueableCollectionQueueableEntity 类型的对象序列化时进行简化,以压缩 job 的 payload,而 Model 类也实现了 QueueableEntity 这个接口,至于怎么解决,恐怕只有自己写个中间类中转一下了,或者把所需要的字段拿出来也塞进 job 里做额外的处理。

4年前 评论
LiamHao (楼主) 4年前
讨论数量: 2

这是因为 SerializesModels,它会把对应的 job 中的 QueueableCollectionQueueableEntity 类型的对象序列化时进行简化,以压缩 job 的 payload,而 Model 类也实现了 QueueableEntity 这个接口,至于怎么解决,恐怕只有自己写个中间类中转一下了,或者把所需要的字段拿出来也塞进 job 里做额外的处理。

4年前 评论
LiamHao (楼主) 4年前

file
我这里怎么可以?

3年前 评论