How to use Event dispatcher system of drupal 8 ?
Drupal's event system allow to create triggers when an event has been happened like create a custom hook on drupal 7.
Create an event.
The first step is, create an event on your custom module (example_events). This class must extend Symfony\Component\EventDispatcher\Event.
Example :
File : example_events/src/ExampleEvent.php
<?php
namespace Drupal\example_events;
use Symfony\Component\EventDispatcher\Event;
class ExampleEvent extends Event {
const RUN = 'event.run';
protected $data;
public function __construct($data) {
$this->data = $data;
}
public function getData() {
return $this->data;
}
public function display() {
drupal_set_message("This is as an example event : ".$this->data);
}
}
Dispatch the event.
You can dispatch the event anywate on your custom module.
Example :
// Use the namespace of the ExampleEvent class
use Drupal\example_events\ExampleEvent;
// Load dispatcher object through services.
$dispatcher = \Drupal::service('event_dispatcher');
// creating our event class object.
$event = new ExampleEvent("My Event");
// Dispatching the event through the ‘dispatch’ method,
// Passing event name and event object ‘$event’ as parameters.
$dispatcher->dispatch(ExampleEvent::RUN, $event);
Now you can Subscribe to this event in the same module or from another module.
Create event Subscriber : Subscribe to the event
Like any other event of drupal, now you can use ‘event_subscriber’ service (See this post)
Example:
File : example_events/src/EventSubscriber/ExampleEventSubScriber.php
<?php
/**
* @file
* Contains \Drupal\example_events\ExampleEventSubScriber.
*/
namespace Drupal\example_events\EventSubscriber;
use Drupal\Core\Config\ConfigCrudEvent;
use Drupal\Core\Config\ConfigEvents;
use Drupal\example_events\ExampleEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Class ExampleEventSubScriber.
*
* @package Drupal\example_events
*/
class ExampleEventSubScriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
// Priority greater than 200 = No Cache (like hook_boot).
$events[ExampleEvent::RUN][] = array('doSomeAction', 300);
return $events;
}
/**
* Subscriber Callback for the event.
* @param ExampleEvent $event
*/
public function doSomeAction(ExampleEvent $event) {
// Get data:
$data = $event->getData();
drupal_set_message("The Example Event has been subscribed, event->getData() returned : '" . $event->getData() . "'");
// Run display() action.
$data = $event->display();
}
}
Tag Event Subscriber Class with event_subscriber
Finally add your Event Subscriber Class to .services.yml
File : example_events.services.yml
services:
example_events.event_subscriber_example:
class: Drupal\example_events\EventSubscriber\ExampleEventSubScriber
tags:
- { name: 'event_subscriber' }
Example from : http://valuebound.com/resources/blog/how-to-define-an-event-dispatcher-and-subscriber-drupal-8
Comments