30.将点赞加入动作流
- 本系列文章为
laracasts.com
的系列视频教程——Let's Build A Forum with Laravel and TDD 的学习笔记。若喜欢该系列视频,可去该网站订阅后下载该系列视频, 支持正版 ;- 视频源码地址:github.com/laracasts/Lets-Build-a-...;
- 本项目为一个 forum(论坛)项目,与本站的第二本实战教程 《Laravel 教程 - Web 开发实战进阶》 类似,可互相参照。
本节说明
- 对应视频第 30 小节:Activity Recording Should Include Favoriting
本节内容
本节我们将 点赞 行为加入到动作流当中。得益于我们将创建动作流的动作抽象成Trait
,我们只需在模型中添加一行代码即可:forum\app\Favorite.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Favorite extends Model
{
use RecordsActivity;
protected $guarded = [];
}
此时如果我们对某一回复进行点赞,数据库中将会增加一条记录:
但是因为我们没有 forum\resources\views\profiles\activities\created_favorite.blade.php 视图文件,如果我们访问个人页面将会报错:
我们修改一下加载动作流局部视图时的逻辑,当视图存在时才加载:
forum\resources\views\profiles\show.blade.php
.
.
@foreach($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
@endforeach
.
.
接着新建视图:
forum\resources\views\profiles\activities\created_favorite.blade.php
@component('profiles.activities.activity')
@slot('heading')
<a href="{{ $activity->subject->favorited->path() }}">
{{ $profileUser->name }} 对回复进行了点赞
</a>
@endslot
@slot('body')
{{ $activity->subject->favorited->body }}
@endslot
@endcomponent
在该视图中,$activity->subject
代表的是某个favority
。现在我们还有两件事情需要做:
- 建立
favorited
模型关联关系; - 新建
path()
方法;
我们已经说过,$activity->subject
代表的是某个favority
,而favority
与其他模型的关联为 多态关联,所以我们建立的关联关系如下:
forum\app\Favorite.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Favorite extends Model
{
use RecordsActivity;
protected $guarded = [];
public function favorited()
{
return $this->morphTo();
}
}
建立了关联之后,现在的$activity->subject->favorited
代表的是某个reply
,所以我们在Reply
模型中新建path()
方法:
forum\app\Reply.php
.
.
public function path()
{
return $this->thread->path();
}
}
刷新页面:
点击链接可以跳转到对应的话题页面。但是我们可以优化一二:跳转定位到点赞的那条回复上。我们首先需要为回复加上id
:
forum\resources\views\threads\reply.blade.php
<div id="reply-{{ $reply->id }}" class="panel panel-default">
.
.
我们还需要修改path()
方法:
forum\app\Reply.php
.
.
public function path()
{
return $this->thread->path() . "#reply-{$this->id}";
}
}
现在我们点击链接就可以跳转定位到具体回复了。