May 26, 2016
Events in Drupal 8 allow for different components of the system to interact and communicate with each other. One system component dispatches the event at an appropriate time; many events are dispatched by Drupal core and the Symfony framework in every request. Other system components can register as event subscribers; when an event is dispatched, a method is called on each registered subscriber, allowing each one to react.
Most of the hooks from previous versions of Drupal were removed in Drupal 8 in favor of Events. Example: hook_init() or hook_boot() which now can be done by registering an event subscriber.
I will use the following structure for the example module:
my_event_subscriber/
- my_event_subscriber.info.yml
- my_event_subscriber.services.yml
- src/
- EventSubscriber/
- MyEventSubscriber.php
Standard my_event_subscriber.info.yml file for the module:
name: Register an Event Subscriber
type: module
description: 'Example: How to Register an Event Subscriber in Drupal 8'
core: 8.x
package: Other
Define a service tagged with 'event_subscriber' in the my_event_subscriber.services.yml.
services:
my_event_subscriber:
class: '\Drupal\my_event_subscriber\EventSubscriber\MyEventSubscriber'
tags:
- { name: 'event_subscriber' }
src/EventSubscriber/MyEventSubscriber.php contains a class that implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
/**
* @file
* Contains \Drupal\my_event_subscriber\EventSubscriber\MyEventSubscriber.
*/
namespace Drupal\my_event_subscriber\EventSubscriber;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Event Subscriber MyEventSubscriber.
*/
class MyEventSubscriber implements EventSubscriberInterface {
/**
* Code that should be triggered on event specified
*/
public function onRespond(FilterResponseEvent $event) {
// The RESPONSE event occurs once a response was created for replying to a request.
// For example you could override or add extra HTTP headers in here
$response = $event->getResponse();
$response->headers->set('X-Custom-Header', 'MyValue');
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
// For this example I am using KernelEvents constants (see below a full list).
$events[KernelEvents::RESPONSE][] = ['onRespond'];
return $events;
}
}
Here is a list of KernelEvents constants:
KernelEvents::CONTROLLER; // The CONTROLLER event occurs once a controller was found for handling a request.
KernelEvents::EXCEPTION; // The EXCEPTION event occurs when an uncaught exception appears.
KernelEvents::FINISH_REQUEST; //The FINISH_REQUEST event occurs when a response was generated for a request.
KernelEvents::REQUEST; // The REQUEST event occurs at the very beginning of request dispatching.
KernelEvents::RESPONSE; // The RESPONSE event occurs once a response was created for replying to a request.
KernelEvents::TERMINATE; // The TERMINATE event occurs once a response was sent.
KernelEvents::VIEW; // The VIEW event occurs when the return value of a controller is not a Response instance.
There are more events available. More event constants.
How to dispatch an event
$dispatcher = \Drupal::service('event_dispatcher');
$dispatcher->dispatch($Event_Name, $Optional_Event_Object);