Подписка на событие

Содержание

Подписка на событие осуществляется при помощи создания сервиса с меткой.

Сервис должен реализовывать Symfony\Component\EventDispatcher\EventSubscriberInterface. Данный интерфейс требует описать метод getSubscribedEvents(), который должен возвращать массив с событиями, на которые необходимо подписаться и что вызывать в случае возникновения события.

Результатом метода может быть:

  • ['eventName' => 'methodName']: Подписка на событие eventName, при возникновении которого будет вызван метод methodName текущего объекта.
  • ['eventName' => ['methodName', $priority]]: По умолчанию приоритет равен 0. Вы можете влиять на то, как рано или поздно вызовется ваш подписчик относительно остальных в пределах данного события. Подписчики вызываются в порядке убывания приоритета.
  • ['eventName' => [['methodName1', $priority], ['methodName2']]]: Вы можете указывать сколько угодно вызовов для одного события.

Хорошей практикой является создание сервисов-подписчиков в /src/EventSubsriber, но это не жесткое требование.

Пример объекта подписчика на событие:

<?php

namespace Drupal\foo\EventSubscriber;

use Drupal\foo\Event\FooEvent;
use Drupal\foo\Event\FooEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Foo event subscriber
 */
class FooSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      FooEvents::EVENT_STARTED => ['doSomething', 100],
    ];
  }

  /**
   * Example for DummyFrontpageEvent::PREPROCESS_HTML.
   */
  public function doSomething(FooEvent $event) {
    $foo_value = $event->getFoo();
  }

}

Далее, регистрируем объект в качестве сервиса с меткой:

services:
  foo.foo_subscriber:
    class: Drupal\foo\EventSubscriber\FooSubscriber
    tags:
      - { name: event_subscriber }

Ссылки

🌱 Помогите нам сделать документацию лучше!

Вся документация Druki с отрытым исходным кодом. Нашли ошибку или неточность? Создайте pull request.

Редактировать текущий документ Обсудить улучшение

Или узнайте как контрибутить.

🤔 По-прежнему нужна помощь?

Не нашли ответа на свой вопрос? Попросите помощи у сообщества!

Задайте вопрос на GitHub Смотрите другие ресурсы сообщества