Наконец-то появилось немного свободного времени. Пляж и шашлыки отменяются (погода нелётная), поэтому давайте уже закончим тему о событиях 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   573     0

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

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

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