Events and hooks Flashcards
Что такое hook, зачем он нужен и как создать свой?
- Хуки — это функции, вызываемые в процессе обработки запроса.
- Цель хуков — позволить сторонним модулям внедряться в работу других модулей или ядра. Как правило, они вызываются в тех местах кода, где сторонние разработчики, вероятнее всего, захотят добавить свою логику, повлиять на ход выполнения операции или результат.
- хуки регистрируются при помощи:
Drupal::moduleHandler()->invokeAll($hook, array $args = []), вызывает все реализации (у всех активных модулей) указанного хука, передавая ему нужные аргументы.
$hook: Название хука, который хотите вызвать\зарегистрировать. $args: Массив из аргументов, которые будут переданы во все хуки.
Drupal::moduleHandler()->alter($type, &$data, &$context1 = NULL, &$context2 = NULL) вызов альтер хука. Префикс hook и суффикс alter будут добавлены автоматически. $type: Название альтер хука.
- Какие есть виды хуков и в чём различия?
Исполняемые хуки — это те хуки, которые вызываются и производят какие-то действия. . Они могут как возвращать данные при помощи return, так и нет. Также, они могут вызываться с передачей аргументов по ссылке.
Альтер хуки — данные хуки всегда вызываются с одной единственной целью - возможностью повлиять на данные. В них всегда приходят аргументы по ссылке.
- Что такое event? В чём его отличия от хука?
• Event: Непосредственно событие. Каждое событие — это объект. У него есть свои собственные уникальные методы, которые добавляет тот, кто данное событие объявил и вызывает. Как правило, туда передаются необходимые данные для данного события, чтобы на их основе можно было принять решение.
• Event Dispatcher: Это сервис, который позволяет получать всю необходимую информацию о событии и производить его “активацию”, чтобы весь код, который подписан, был активирован.
• EventSubscriber: Подписчики на события это объекты, которые и выполняют код при определенных событиях. В них описывается на какие события подписан конкретный объект, их позиция в процессе выполнения, и, как правило, сам код для события.
Не стоит путать события с \Drupal::moduleHandler()->alter(). Альтер подразумевает изменение информации, когда передает данные, что явно указано в его названии. Событие же, “оповещает”, что что-то произошло, о чём вам необходимо знать, и передает вам дополнительную информацию о событии, чтобы вы могли что-то сделать, на основе полученной информации. Там также можно изменять часть данных, но это можно сделать когда в событие передается объект, со своими внутренними свойствами, где хранятся данные, и куда можно при помощи его же методов добавить новые. В общем случае, событие лишь оповещает модули, дает им информацию, и не ожидает ответа.