События на практике - обработчики и журнал событий
События - подтема на 14 вопросов из собранных. Здесь собраны решения по обработчикам и по журналу событий сайта.
Что общего у этих задач
Событие срабатывает там, где его вызвали. Модуль объявляет свои точки расширения сам, и обработчик получает управление ровно в этих местах. Создание записи мимо API модуля - прямым запросом к базе или чужим кодом - событие не породит.
События делятся на до и после. Первые выполняются перед действием и умеют его отменить, вторые - после, и отменять там уже нечего. Половина вопросов о «неработающем обработчике» упирается именно в это различие.
Журнал событий - отдельный механизм. Он пишет действия пользователей и системные происшествия, а не срабатывания обработчиков. Своя запись в нём появляется только если её туда положили явно.
Обработчик выполняется внутри чужой операции. Всё, что он делает медленно или ненадёжно, замедляет и ломает сохранение заказа или товара, а виноватой выглядит платформа.
Решения подтемы
- Обработчик события: регистрация, аргументы, отмена действия - где регистрировать, чем «до» отличается от «после», как отменить.
- Журнал событий: чтение, очистка, свои записи - что туда попадает, как писать своё, как чистить.
- Свои события в своём коде - отправка события модуля, ответы подписчиков, отмена.
- Свой журнал решения: файл, ротация, что писать - отдельный файл, состав записи и ротация.
- Обработчик события не срабатывает: разбор причин - регистрация, имя события, формат аргументов, потеря изменений.
- Ошибки в своём коде: результат вместо исключения, журнал, показ - объект результата, коллекция ошибок, границы перехвата.
- Логирование решения: логгер по стандарту, настройка, контекст - логгер по имени, настройка приёмника, контекст, ротация.
- Обработчик меняет данные: рекурсия, флаг, массовые операции - защита флагом, массовые операции, отложенная запись.
- Обработчик срабатывает дважды: разбор причин - двойная регистрация, повторное сохранение, массовые операции, фон.
- Как найти нужное событие: поиск по ядру и три системы - поиск вызова, список обработчиков, три системы.
Частые вопросы
Где регистрировать обработчик?
Разовый - в файле инициализации сайта, постоянный - при установке модуля. Первый действует на текущий запрос, второй хранится в базе и снимается вместе с модулем.
Почему обработчик не срабатывает?
Чаще всего действие идёт мимо API модуля либо перепутано событие «до» и «после». Событие вызывает код модуля, а не сама база данных.
Как отменить сохранение из обработчика?
Только в событии «до»: обработчик возвращает признак отмены или бросает исключение. В событии «после» действие уже выполнено.
Пишет ли журнал срабатывания обработчиков?
Нет, это разные механизмы. В журнал попадают действия пользователей и системные происшествия, а свои записи туда добавляют явным вызовом.
Связанные темы
- Ядро D7 - основы - устройство событийной модели
- События, агенты и бизнес-процессы - соседние механизмы расширения
- Агенты и cron - фоновые задачи вместо обработчиков
- Раздел Ядро и разработка