Действия пользователя. Часть 2

В прошлой части мы подготовили модели для добавления нового функционала в профиль пользователя. В данной части завершим начатое и выведем созданные пользователем сообщения/темы на страницу его профиля.

В прошлой части в модель Activity мы добавили метод feed() для выборки последних 50 записей из таблицы activities, сгруппированные по дате создания темы/сообщения. Давайте теперь вызовем этот метод из контроллера ProfilesController. Для этого нужно изменить метод show() контроллера следующим образом:
public function show(User $user)
{
    return view('profiles.show', [
        'profileUser' => $user,
        'activities' => Activity::feed($user)
    ]);
}
Вторым элементом массива мы передаем переменную $activities (с выборкой тем/сообщений из таблицы activities) в вид profiles.show.

Далее в модель User добавим связь с моделью Activity:
public function activity()
{
    return $this->hasMany(Activity::class);
} 
Теперь, когда пользователь связан с его активностью, и контроллер передает данные об активности пользователя из БД в вид profiles.show, можно переходить к работе с отображением страницы профиля, то есть к видам.

В первую очередь откроем вид profiles.show (папка resources/views/profiles). Здесь нам нужно удалить все строки начиная от @foreach ($threads as $thread) и заканчивая {{ $threads->links() }}. Затем нужно добавить новые строки:
@foreach ($activities as $date => $activity)
    <h3 class="page-header">{{ $date }}</h3>
    @foreach ($activity as $record)
        @include ("profiles.activities.{$record->type}", ['activity' => $record])
    @endforeach
@endforeach
Для наглядности приведу полное содержимое файла show.blade.php. Добавленные строчки здесь выделены жирным шрифтом.
@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="page-header">
                    <h1>
                        {{ $profileUser->name }}
                        <small>Профиль был создан {{ $profileUser->created_at->format('d-m-Y') }} в {{ $profileUser->created_at->format('H:i:s') }}</small>
                    </h1>
                </div>

                @foreach ($activities as $date => $activity)
                    <h3 class="page-header">{{ $date }}</h3>
                    @foreach ($activity as $record)
                        @include ("profiles.activities.{$record->type}", ['activity' => $record])
                    @endforeach
                @endforeach
            </div>
        </div>
    </div>
@endsection 
В конструкции @foreach мы выводим полученные из контроллера ProfilesController строки таблицы activities, с группированные по дате создания. В зависимости от содержимого поля type таблицы activities (created_thread или created_reply) выбираем свой вид для темы или сообщения. Это будут виды: profiles.activities.created_reply и profiles.activities.created_thread.

Создадим новую папку activities (внутри папки resources/views/profiles). В ней создадим нужные виды.

Создадим файл created_reply.blade.php и добавим в него следующее содержимое:
@component('profiles.activities.activity')
    @slot('heading')
        <span class="flex">
	        {{ $profileUser->name }} ответил в
	        <a href="{{ $activity->subject->thread->path() }}">"{{ $activity->subject->thread->title }}"</a>
        </span>
        <span>{{ $activity->subject->created_at->format('d-m-Y | H:i:s') }}</span>
    @endslot

    @slot('body')
        {{ $activity->subject->body }}
    @endslot
@endcomponent 
Создадим файл created_thread.blade.php и добавим в него следующее содержимое:
@component('profiles.activities.activity')
    @slot('heading')
    	<span class="flex">
	        {{ $profileUser->name }} опубликовал
	        <a href="{{ $activity->subject->path() }}">{{ $activity->subject->title }}</a>
        </span>
        <span>{{ $activity->subject->created_at->format('d-m-Y | H:i:s') }}</span>        
    @endslot

    @slot('body')
        {{ $activity->subject->body }}
    @endslot
@endcomponent
В этих двух видах мы используем Blade-директиву @component. То есть содержимое этих видов будет включаться в отдельный компонент, в нашем случае profiles.activities.activity. Создадим новый файл для этого компонента – activity.blade.php (в папке resources/views/profiles/activities). Добавим в файл следующее содержимое:
<div class="panel panel-default">
    <div class="panel-heading">
        <div class="level">
        	{{ $heading }}
        </div>
    </div>

    <div class="panel-body">
        {{ $body }}
    </div>
</div>
На этом работа закончена. Страница профиля пользователя теперь будет иметь следующий вид: