Menu

30.将点赞加入动作流

本节说明

  • 对应视频第 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 = [];
}

此时如果我们对某一回复进行点赞,数据库中将会增加一条记录:
file
但是因为我们没有 forum\resources\views\profiles\activities\created_favorite.blade.php 视图文件,如果我们访问个人页面将会报错:
file
我们修改一下加载动作流局部视图时的逻辑,当视图存在时才加载:
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。现在我们还有两件事情需要做:

  1. 建立favorited模型关联关系;
  2. 新建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();
    }
}

刷新页面:
file
点击链接可以跳转到对应的话题页面。但是我们可以优化一二:跳转定位到点赞的那条回复上。我们首先需要为回复加上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}";;
    }
}

现在我们点击链接就可以跳转定位到具体回复了。

本文章首发在 Laravel China 社区
上一篇 下一篇
讨论数量: 0
发起讨论


暂无话题~
刻意练习,每日精进。
7
点赞
185
浏览
0
讨论

维护者
18
18