События в Laravel. Введение

Любое серъезное приложение имеет механизм событий. Они позволяют взаимодействовать различным функциональным частям приложения друг с другом. И Laravel не исключение. Начать изучение можно с официальной документации (на русском языке). Несмотря на довольно подробное описание, у начинающих знакомится с Laravel возникает большое количество вопросов. Это потому, что этот материал хоть и не сложный, но довольно запутанный. После прочтения возникают вопросы — чем отличаются друг от друга обозреватели, слушатели, подписчики? Где их регистрировать? Все эти вопросы мы и постараемся разобрать.

Начнём со сравнения событийных моделей MODX и Laravel. В MODX функционал событий значительно проще. Давайте вспомним как они работают.

Событийная модель MODX

MODX поставляется с уже большим количеством событий — для фронтэнда, для админки и для моделей (объектов). Все события разбиты по категориям и хранятся в специальной таблице. Добавить своё событие можно в админке или sql запросом. Для обработки события нужно создать плагин и отметить нужные события, при наступлении которых он сработает. Если нужно запустить своё событие, используется метод $modx->invokeEvent('eventName', $params). Достаточно просто — есть события, есть место, где подключается обработчик (плагин).

Событийная модель Laravel

Так как Laravel всё-таки фреймворк, а не CMS, то заранее прописанных событий в нём крайне мало. Данная задача ложится на плечи разработчика. Например, событий для фронтэнда мне удалось найти только 2 — RequestHandled (аналог onHandleRequest) и RouteMatched (URL найден). И всё. Как по мне, то можно было бы добавить пару событий: одно часто используемое в MODX событие — OnWebPagePrerender, чтобы можно было поковыряться в контенте перед выводом в браузер, а второе типа OnWebPageComplete.

Из коробки в Laravel предусмотрено 12 событий для работы с моделями («booting», «booted», «creating», «created», «updating», «updated», «deleting», «deleted», «saving», «saved», «restoring», «restored») и 7 событий для юзера («Attempting», «Login», «Authenticated», «Failed», «Logout», «Lockout», «Registered»). Ещё есть событие записи в журнал ошибок. Полезная вещь. Есть ещё некоторые события, но их мы рассмотрим в следующих статьях.

Сами события могут быть представлены либо строкой либо классом. Для них нет специальной таблицы как в MODX. Запускаются они методом Illuminate\Events\Dispatcher::fire('event'). А вот прописать реакцию на событие (обработчик) также просто как в MODX не получится. Существует несколько способов регистрации слушателя, и вот с этим, как правило, и бывают проблемы у начинающих. Ещё частенько возникает вопрос — где регистрировать? В принципе ничего сложного нет, механизм схожий с javascript и jQuery:

// Создали обработчик 
$('#element').on('my-event', function(){};
...
// В нужном месте вызвали событие
$('#element').trigger('my-event');

Заключение

Вот такие, если говорить коротко, отличия моделей событий в MODX (версия 2.5.х) и Laravel (версия 5.4). А в следующей статье мы подробнее рассмотрим механизм событий — запуск и их обработку.