Создание события

Создание события состоит из описания объекта события, а также, вызова события в нужный момент с передачей данного объекта.

Создание объекта события

Объект события передается в момент вызова события всем, кто подписался на него. Он позволяет передать всю необходимую информацию, какая может оказаться полезной.

События всегда получают объект события, но событие необязательно должно описывать свой объект. Если цель вашего события лишь сообщить, что что-то произошло в системе, и оно не несет никакой полезной нагрузки в виде данных, данный этап можно пропустить. В данном случае будет создан стандартный Symfony\Component\EventDispatcher\Event.

Во всех остальных случаях, для определенного типа событий создаётся свой собственный, который расширяет Symfony\Component\EventDispatcher\Event.

Пример объекта события:

<?php

namespace Drupal\foo\Event;

use Symfony\Component\EventDispatcher\Event;

/**
 * Provides custom event object.
 */
class FooEvent extends Event {

  /**
   * Some event started.
   */
  const EVENT_STARTED = 'foo.something.started';

  /**
   * The foo value.
   *
   * @var string
   */
  protected $foo;

  /**
   * Constructs a FooEvent object.
   *
   * @param string $foo
   *   The foo value.
   */
  public function __construct($foo) {
    $this->foo = $foo;
  }

  /**
   * Gets foo value.
   *
   * @return string
   *   The foo value.
   */
  public function getFoo() {
    return $this->foo;
  }

}

Таким образом мы создали объект FooEvent и подготовили для него название foo.something.started. Обратите внимание, что название события задаётся в константе объекта. Обращение к событиям, как правило, происходит при помощи EventObject::EVENT_NAME, поэтому, это является хорошей практикой.

Вызов события

Когда у вас есть объект вашего события, вам его необходимо вызывать. Для вызова события используется сервис event_dispatcher.

Сервис event_dispatcher содержит всего один единственный метод dispatch(), который принимает в качестве аргументов:

  • $event_name: Строковое название события.
  • Event $event: (опционально) Объект события, который расширяет Symfony\Component\EventDispatcher\Event.

Пример вызова события:

$event = new FooEvent('Hello World');

/** @var \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $dispatcher */
$dispatcher = \Drupal::service('event_dispatcher');
$dispatcher->dispatch(FooEvent::EVENT_STARTED, $event);

Рекомендации

Регистрация названий событий

В примере выше мы создали константу EVENT_STARTED с названием события непосредственно в объекте события. Хорошей практикой является создания отдельного объекта, который содержит названия всех событий объявляемых модулем или определенную группу события. Как правило, подобный объект создают рядом с объектом события и называют FooEvents.

Пример:

<?php

namespace Drupal\foo\Event;

/**
 * Provides list of foo events..
 */
final class FooEvents {

  /**
   * Some event started.
   */
  const EVENT_STARTED = 'foo.something.started';

}

Ссылки

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

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

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

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

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

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

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