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