Observer 中处理逻辑,获取不到模型更新后的值

需求是这样的:更改订单图片之后,重新生成订单详情的PDF

1. 首先我在 Service 层写好了 PDF 的生成代码

GeneratePDFService.php

\PDF::loadFile(admin_route('order-items.pdf-review', ['order_item' => $params['item_id'], 'tag' => $params['tag']]))
    ->setPaper('a5')
    ->save(storage_path("app/public/$save_path"));

admin_route(‘order-items.pdf-review’) 指向控制器代码

$item = OrderItem::query()->with(['order', 'order.address'])->find($id);

logger($item->image_url);

return view('admin.order.print.' . strtolower($item->order->category->name), compact('item', 'tag'));

2. 然后我创建了一个生成 PDF 的 Job,其中调用了 Service 层的代码

GeneratePDFJob.php

app(GeneratePDFService::class)->generateOrderPDF($this->order_id);

3. 最后我在 Observer 的 saved 方法中触发了 Job

OrderObserver.php

dispatch(new GeneratePDFJob($order_id));

出现的问题:在触发 Job 之后,控制器中打印的图片路径还是改动之前的,因为之前的图片已经被改动删掉了,所以此时生成的 PDF 中是没有图片的

接着我手动执行触发了 Job,生成的 PDF 正常,有图片信息

总结一下现象就是:

// 队列执行前打印
logger("1. $order->image_url")

// -------------------------------------

dispatch(new GeneratePDFJob($order_id));
// 队列中 Order 模型是重新从数据库中查出来
// 队列执行中打印
logger("2. $order->image_url"));

// 队列执行后打印
logger("3. $order->image_url")

打印结果

1. 3174415474524810991ec5351f761e01.png  
2. bf7df954a6994937a26790e46e03d7a9.png  
3. 3174415474524810991ec5351f761e01.png

可以看到队列执行前后打印的都是新的图片地址,执行中打印的是旧的图片地址

哪位大佬可以解惑

:computer: & :coffee:
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

你的问题是 Job 没触发, 还是 Job 中拿到的模型是修改之前的? 如果是 Job 中拿到的模型有问题, 你可以使用 fresh 方法刷新一下模型。

Laravel

1年前 评论
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
讨论数量: 25

你的问题是 Job 没触发, 还是 Job 中拿到的模型是修改之前的? 如果是 Job 中拿到的模型有问题, 你可以使用 fresh 方法刷新一下模型。

Laravel

1年前 评论
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
W-W (楼主) 1年前
W-W (楼主) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前
徵羽宫 (作者) 1年前

Job dispatch 后就进队列了

当前执行的任务是不管队列内容的,控制器中返回的自然是执行 Job 之前的内容。

想同步返回就在 saved 中直接调用 Service。

1年前 评论
徵羽宫 1年前

@wxfjamdc @徵羽宫 我悟了!我之前用的一直都是同步队列,刚试了不用同步,改成数据库驱动,就可以了,但是个中缘由还不清楚,反正现在是能跑了,总之感谢二位🤞

1年前 评论
徵羽宫 1年前
徵羽宫 1年前
徵羽宫 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!