Наконец-то появилось немного свободного времени. Пляж и шашлыки отменяются (погода нелётная), поэтому давайте уже закончим тему о событиях Laravel. Итак, в предыдущих статьях мы узнали как устроен механизм событий в Laravel, познакомились с событийными моделями Eloquent моделей и пользователей. Осталось выяснить, какие ещё события нам доступны из коробки. Поехали!

Событие записи в журнал

Данное событие представлено классом Illuminate\Log\Events\MessageLogged и содержит 3 свойства — level, message и context. Если вы хотите уведомить администратора сайта об ошибке, то просто зарегистрируйте обработчик для данного события (регистрацию событий мы рассматривали тут).

События БД

В Laravel версии 5.4 для работы с базой данных предусмотрены аж целых 5 классов событий:

  • Illuminate\Database\Events\QueryExecuted
  • Illuminate\Database\Events\StatementPrepared
  • Illuminate\Database\Events\TransactionBeginning
  • Illuminate\Database\Events\TransactionCommited
  • Illuminate\Database\Events\TransactionRolledBack

По названиям классов вполне ясно, за какое событие они отвечают. Из этого списка самое интересное событие — это первое. С помощью этого события можно видеть все запросы к БД при загрузке страницы. При разработке вещь неоценимая. Конечно, его можно регистрировать и самостоятельно, но создатели Laravel упростили этот способ:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql - показывает сформированный SQL запрос
            // $query->bindings - показывает подстановки для запроса
            // $query->time - время запроса
            dump($query->sql); // Выводим на страницу
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Событие StatementPrepared вызывается, когда запрос подготовлен. В обработчике можно обратиться к свойству statement, которое содержит экземпляр класса PDOStatement.

Остальные 3 события используются при транзакциях.

События системы кэширования

  • Illuminate\Cache\Events\CacheHit — это событие сработает при запросе данных из кэша. Содержит свойства key и value.
  • Illuminate\Cache\Events\CacheMissed — сработает, если запрашиваемые данные не найдены. Содержит свойство key
  • Illuminate\Cache\Events\KeyForgotten — сработает при удалении данных из кэша. Содержит свойство key
  • Illuminate\Cache\Events\KeyWritten — срабатывает при сохранении данных в кэше. Содержит свойства key, value и minutes.

События при отправке почты

  • Illuminate\Mail\Events\MessageSending — срабатывает до отправки сообщения. Если обработчик вернёт false, то сообщение отправлено не будет.
  • Illuminate\Mail\Events\MessageSent — срабатывает после отправки сообщения.

Оба класса содержат свойство message, в котором хранится текст сообщения.

События уведомлений

  • Illuminate\Notifications\Events\NotificationSending — срабатывает перед отправкой уведомления. Как и в случае с почтовым сообщением позволяет отменить уведомление.
  • Illuminate\Notifications\Events\NotificationSent — срабатывает после отправки уведомления.
  • Illuminate\Notifications\Events\NotificationFailed — сбой отправки уведомления.
  • Illuminate\Notifications\Events\BroadcastNotificationCreated — запускается при отправке широковещательного сообщения.

События очередей

  • Illuminate\Queue\Events\JobProcessing — срабатывает перед выполнением задачи.
  • Illuminate\Queue\Events\JobProcessed — срабатывает после того, как задача выполнена.
  • Illuminate\Queue\Events\JobFailed — сбой выполнения задачи.
  • Illuminate\Queue\Events\JobExceptionOccurred — вызывается когда при обработке задачи срабатывает исключение.
  • Illuminate\Queue\Events\Looping — событие демона (worker) перед началом выполнения задачи.
  • Illuminate\Queue\Events\WorkerStopping — событие остановки демона-обработчика.

Регистрировать эти события можно как описанными в предыдущей статье способами, так и используя фасад Queue.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Queue;
use Illuminate\Support\ServiceProvider;
use Illuminate\Queue\Events\JobProcessed;
use Illuminate\Queue\Events\JobProcessing;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Queue::before(function (JobProcessing $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });

        Queue::after(function (JobProcessed $event) {
            // $event->connectionName
            // $event->job
            // $event->job->payload()
        });
        
        Queue::failing(function (JobFailed $event) {
            // $event->connectionName
            // $event->job
            // $event->exception
        });
        
        Queue::exceptionOccurred(function (JobExceptionOccurred $event) {
            // $event->connectionName
            // $event->job
            // $event->exception
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Событие маршрутизатора

Для маршрутизатора в Laravel заготовлено всего одно событие Illuminate\Routing\Events\RouteMatched. Срабатывает оно когда маршрут найден. Было бы удобно, если бы и для отсутсвующего маршрута было событие. Но это так, к слову.

Зарегистрировать это событие можно через фасад Route в сервис-провайдере:

//AppServiceProvider

public function boot()
{
    Route::matched(function (RouteMatched $event) {
        // $event->route
        // $event->request
    });
}

Заключение

На этом обзор закончен. Это не полноценное руководство, а скорее знакомство. Теперь вы знаете, что можно использовать для своих целей. А чтобы знать как это использовать, придётся заглянуть в документацию и возможно в исходники.

30 июня 2017, 21:30   536     0

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.