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
可以看到队列执行前后打印的都是新的图片地址,执行中打印的是旧的图片地址
哪位大佬可以解惑
你的问题是 Job 没触发, 还是 Job 中拿到的模型是修改之前的? 如果是 Job 中拿到的模型有问题, 你可以使用 fresh 方法刷新一下模型。