为什么新建话题后跳转到详情页,slug为空,但数据库中slug写入成功?

1.新建话题
新建帖子后跳转到详情页,slug为空,数据库中slug写入成功
2.跳转到话题详情页,URL中没有slug

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功
3.数据库中能看到对应话题的slug是写入成功了的

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功
4.刷新页面后,URL中的slug能正常显示

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功

5.重新新建一个话题,在TopicsController/show 中dd返回的$topic

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功
返回值中slug为空

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功

数据库中slug写入成功

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功
为什么新建话题后,跳转到话题详情页时slug为空,但是数据库中却有值?(刷新后url中就能正常显示slug了,dd($topic)slug中也有值。)

新建话题后跳转到详情页,slug为空,但数据库中slug写入成功

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 6

你好,你在保存时用 dd() 打印查看存储参数的方式很好,但 dd() 中断了 观察者Saving 事件,所以此时 slug 为空。

保存后的跳转是这样写的吗?

return redirect()->to($topic->link())->with('success', '成功创建话题!');
3年前 评论

@MArtian ,你好,我保存后的跳转是和你截图里面写的一样的。

file
dd是我第二次测试用的,请看我问题的中的1-4点,在没有dd中断观察者的saved的情况下,跳转后话题详情页的URL也不显示slug,但是数据库里面slug已经保存成功了,刷新详情页URL中的slug才正常显示,请问这是什么原因呢?
(github.com/cocaomouse/larabbs 我的代码上传在这里)

3年前 评论

@cocaomouse 请问你做 翻译标题 分发任务了吗?麻烦把 Topic 观察者代码贴一下

3年前 评论

@MArtian Topic观察者代码在这里 github.com/cocaomouse/larabbs/blob... 做了 翻译标题 分发任务;新建 话题 后,数据库里面也有 slug 数据

file 但是跳转到 话题详情页,URL中就没有slug,

file

刷新页面后,URL中的slug就出现了

file 我的疑惑是,为什么在数据库有数据的情况下,slug不显示,要刷新后才显示?

3年前 评论

@cocaomouse 噢,我明白你的意思了,因为这里观察者使用了任务分发去调用 百度翻译 API 接口,这里的提交实际上是 异步 的。

当点击保存时,程序的执行流程是这样的:

  1. 观察者事件触发 Saving,先过滤 XSS 字符,生成话题摘录
  2. 然后触发 Saved 事件,此时这条数据已在库中,但 slug 为空,然后分发任务去调用 百度翻译 API
  3. 此时因为数据已经提交保存,页面已经发生跳转,但 请求百度翻译接口需要响应时间,所以你看到的标题此时没有 slug,再次刷新时,百度接口响应请求并返回了数据,分发任务已经把翻译好的 slug 写库,你再次刷新就看到了翻译好的 slug

要验证这一点也很简单,把 .env 文件中的 百度翻译API 的 BAIDU_TRANSLATE_APPIDBAIDU_TRANSLATE_KEY 删掉,再发布一次试试看就明白了。

3年前 评论

@MArtian 我明白怎么回事了,刚才仔细看了下Laravel Horizon的记录,以id=151为例, 注意 Pushed At:2021-08-09 16:54:17;Completed At:2021-08-09 16:54:18;

file 再看数据库中的时间

file 队列推送和控制器中的create是 异步 的,控制器新增数据之后,队列才去推送数据,然后完成数据表单slug字段更新,所以一开始跳转到话题详情页没有slug,刷新后才有slug,就是因为这个时间差。 刷新数据库看到的slug,已经是队列推送完成后的数据,所以slug已经存在数据表单中了。

谢谢你的耐心解答。

3年前 评论
MArtian 3年前

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