Laravel 5.4-5.8

После того как мы установили фреймворк на сервер, нужно создать таблицу в базе данных. Таблица будет представлять собой простой пример записи блога, содержащая столбцы: название поста, содержимое поста и столбец счетчика просмотров. Создадим миграцию для нашей таблицы, используя следующую команду: php artisan make:migration create_posts_table --create=posts Добавим несколько строк в файл миграции (database/migrations/ время_создания_create_posts_table.php), в функцию "up", чтобы она выглядела следующим образом:
public function up()
{
  Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->text('content');
    $table->integer('view_count')->default(0);
    $table->timestamps();
    });
}
Запустим подготовленные миграции:
php artisan migrate
Создаем модель
php artisan make:model Post
Для создания записей в таблице используем tinker, для этого в командной строке ведем такую команду:
php artisan tinker
Затем, должны появиться строки:
Psy Shell v0.7.2 (PHP 7.0.8 — cli) by Justin Hileman
>>>
Добавим в таблицу пару постов:
$post = new App\Post;
$post->title = 'Post1';
$post->content = 'Content1';
$post->save();

$post2 = new App\Post;
$post2->title = 'Post2';
$post2->content = 'Content2';
$post2->save();
Далее создадим заготовку контроллера с помощью команды:
php artisan make:controller PostController --resource
Откроем файл PostController.php и в секции функции "show($id)" добавим:
public function show($id)
{
  $post = Post::findOrFail($id);
  return view('posts.show', compact('post'));
}
Выше строки class PostController extends Controller нужно добавить строчки:
use App\Post;
use App\Events\PostHasViewed;
Далее пропишем маршрут в файле routes/web.php:
Route::resource('posts', 'PostController');
С версии 5.0 по версию 5.2 маршруты находились в файле app/Http/routes.php
В контроллере мы указали "posts.show". То есть вид будет называться "show" и лежать в папке posts. Для чего мы должны ее создать в папке resources/views, и назвать файл "show.blade.php". В нем мы просто выведем содержимое поста. Файл будет выглядеть следующим образом:
id: {{$post->id}}
<br>
Название поста: {{$post->title}}
<br>
Текст поста: {{$post->content}}
<br>
Количество просмотров: {{$post->view_count}}
<br>
Все. С подготовительной частью мы закончили. Можно перейти по адресу http://адрес_вашего_сайта/posts/id_поста и на экран будет выведено содержимое записи блога с указанным id. Далее реализуем сам подсчет просмотров страницы поста. Сделаем мы это с помощью системы событий. Документация об этом на английском языке есть на сайте фреймворка laravel.com, в разделе Events.

Но теперь у нас развилка, как в сказке: две дороги, одна длинная, а другая короткая. Какой идти дальше решать вам. В первом случае нам нужно создать два отдельных класса: класс слушателя и класс события. После чего зарегистрировать их в EventServiceProvider, в массиве $listen. Второй вариант – гораздо более короткий. Нужно лишь создать анонимную функцию слушателя в методе boot() класса EventServiceProvider, с указанием имени события. После чего в нужном месте приложения вызвать событие с данным именем. Далее распишу подробнее, как это делается.

Первый способ (длинный)
Для начала откроем ранее созданный контроллер PostController.php, в секции метода "show" нужно добавить новую строку:
event(new PostHasViewed($post));
Окончательный вид метода будет таким:
public function show($id)
{
  $post = Post::findOrFail($id);
  event(new PostHasViewed($post));
  return view('posts.show', compact('post'));
}
Добавленная строка отвечает за возбуждение события в данном месте.

Далее зарегистрируем событие в файле app/Providers/EventServiceProvider.php. Массив $listen изменим таким образом:
protected $listen = [
  'App\Events\PostHasViewed' => [
    'App\Listeners\Counter',
  ],
];
Создадим php-файлы для события и слушателя, для этого наберем следующую команду:
php artisan event:generate
После чего в папке app появятся две новые папки: Events и Listeners. С ними и будем дальше работать. Откроем файл Events/PostHasViewed.php, в нем, в самом начале файла, после строки:
namespace App\Events;
добавим строку:
use App\Post;
В классе PostHasViewed, после строки:
Версия 5.4
use InteractsWithSockets, SerializesModels;
Версия 5.8
use Dispatchable, InteractsWithSockets, SerializesModels;
объявим переменную:
public $post;
Конструктор изменим таким образом:
public function __construct(Post $post)
{
  $this->post = $post;
}
С событием закончили, переходим к слушателю. Откроем файл Listeners/Counter.php. В нем метод handle() изменим следующим образом:
public function handle(PostHasViewed $event)
{
  $event->post->increment('view_count');
}
Все, теперь можно попробовать поперезагружать страницу с любым постом из блога, в результате число в строке "Количество просмотров" должно инкрементироваться.

Второй способ (короткий)
Откроем файл контроллера PostController.php, и добавим в секцию метода "show" вызов события с нужным именем.
event('postHasViewed', $post);
Окончательный вид метода будет таким:
public function show($id)
{
  $post = Post::findOrFail($id);
  event('postHasViewed', $post);
  return view('posts.show', compact('post'));
} 
Добавленная строка отвечает за возбуждение события в данном месте.

Далее зарегистрируем событие в файле app/Providers/EventServiceProvider.php. В метод boot() добавим анонимную функцию слушателя.
Event::listen('postHasViewed', function ($post) {
    $post->increment('view_count');
});
И это все! Теперь можно попробовать поперезагружать страницу с любым постом из блога, в результате число в строке "Количество просмотров" должно инкрементироваться.