Счетчик просмотров страницы в Laravel

После того как мы установили фреймворк на сервер, нужно создать таблицу в базе данных. Таблица будет представлять собой простой пример записи блога, содержащая столбцы: название поста, содержимое поста и столбец счетчика просмотров. Создадим миграцию для нашей таблицы, используя следующую команду: 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.8cli) 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, после строки:

use 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');
});

И это все! Теперь можно попробовать поперезагружать страницу с любым постом из блога, в результате число в строке «Количество просмотров» должно инкрементироваться.