35.遗留的 Bug

未匹配的标注

本节说明

  • 对应视频第 35 小节:Squashing Bugs

本节内容

上一节我们改造了 点赞与取消点赞功能,但我们遗留了 Bug 未解决:
file
我们对回复进行了点赞与取消点赞的反复测试:当我们点赞的时候,activities表中会增加一条记录,这当然是正确的;但是当我们取消点赞的时候,这条记录却没有删除,这就会导致我们访问个人页面时出现报错:
file
我们来追踪一下这个 Bug 产生的原因。我们在Favorite模型中引入了RecordsActivityTrait,而在RecordsActivity中我们已经监听了模型的deleting事件:

. . static::deleting(function ($model){ $model->activity()->delete(); }); . .

回想一下,其实类似的问题我们在前面的章节中遇到过:我们删除话题的时候也会进行关联回复的删除,同时会把回复相关的动作流也进行删除。当时产生问题的原因是因为我们删除回复时,是通过sql语句where条件进行的批量删除,导致模型的deleting事件没有被监听到。这次的原因类似:
forum\app\Favoritable.php

. . public function unfavorite() { $attributes = ['user_id' => auth()->id()]; $this->favorites()->where($attributes)->delete(); } . .

我们通过sql语句进行删除,所以未监听到模型的deleting事件。既然知道了原因,那么修复起来就很简单了:

. . public function unfavorite() { $attributes = ['user_id' => auth()->id()]; $this->favorites()->where($attributes)->get()->each->delete(); } . .

我们使用get()获取模型实例的集合,并且每个模型实例分别调用delete()方法。这样一来,favorite模型的deleting事件就会被监听到,相关的动作流也会被删除。现在我们删除之前的错误动作流数据,再次进行取消点赞操作:
file
但是我们仍有 Bug 待修复。如果我们对某个回复进行了点赞,但是该回复被删除,访问个人页面依然会报错:
file

我们清空activitiesfavorites表的数据之后再次测试:
file
但是我们发现清空之后的个人页面给人的体验不好,所以我们修改一下视图:
forum\resources\views\profiles\show.blade.php

. . @forelse($activities as $date => $activity) <h3 class="page-header">{{ $date }}</h3> @foreach($activity as $record) @if(view()->exists("profiles.activities.{$record->type}")) @include("profiles.activities.{$record->type}",['activity' => $record]) @endif @endforeach @empty <p>There is no activity for this user yet.</p> @endforelse . .

再次刷新页面:
file
接着修复 Bug:
forum\app\Favoritable.php

. . protected static function bootFavoritable() { static::deleting(function ($model) { $model->favorites->each->delete(); }); } . .

我们还剩下最后一个小 Bug 需要修复:未登录用户可以看到点赞按钮。
file
修复它:
forum\resources\views\threads\reply.blade.php

. . @if(Auth::check()) <div> <favorite :reply="{{ $reply }}"></favorite> </div> @endif . .

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~