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:
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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年前

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