{"componentChunkName":"component---src-templates-post-jsx","path":"/en/event-api","result":{"data":{"markdownRemark":{"html":"<p>Drupal has always provided a wealth of hooks that allow specific processing tied to a given action.</p>\n<p>Before diving into the Event API, it is important to clarify that hooks are simply PHP functions that allow you to interact with Drupal's core, modules, and themes.</p>\n<p><strong><em>Example of hooks:</em></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token comment\">/**\n * Implements hook_ENTITY_insert().\n *\n */</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">hook_entity_insert</span><span class=\"token punctuation\">(</span>Drupal\\<span class=\"token package\">Core<span class=\"token punctuation\">\\</span>Entity<span class=\"token punctuation\">\\</span>EntityInterface</span> <span class=\"token variable\">$entity</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token variable\">$entity</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getEntityType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">id</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token single-quoted-string string\">'node'</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token variable\">$entity</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">bundle</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token double-quoted-string string\">\"article\"</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n   <span class=\"token variable\">$entity</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">setTitle</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$entity</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">label</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">.</span> <span class=\"token single-quoted-string string\">' '</span> <span class=\"token punctuation\">.</span> <span class=\"token function\">date</span><span class=\"token punctuation\">(</span><span class=\"token double-quoted-string string\">\"Y/m/d\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n   <span class=\"token variable\">$entity</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">save</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In this example, <em>hook<em>ENTITY</em>insert</em> allowed us to interact with the Node entity, modifying it before it was saved to the database.\nIt is hard to deny that the hook system is extremely powerful — so you might wonder why we would adopt the Event API instead!</p>\n<h2>After the arrival of Drupal 8 ....</h2>\n<p>As we saw in the previous section, the hook system proved itself in older versions of Drupal. However, with the arrival of Drupal 8, the biggest challenge was rebuilding the CMS to adopt the object-oriented paradigm using Symfony framework components. In this context, Drupal introduced Symfony's Event API in version 8, while keeping the hook system — which was supposed to be completely removed in Drupal 9.</p>\n<h3>But how can we use the Event API in Drupal 8?</h3>\n<p>Theoretically, there is an event registry called the <strong><em>Event Registry</em></strong></p>\n<ul>\n<li>We can declare or dispatch an event in the Event Registry to allow other modules to intervene and modify our module, using the <strong><em>EventDispatcher</em></strong> class.</li>\n<li>We can subscribe to an event in the Event Registry — that is, listen to or monitor a given event to trigger a specific action — using the <strong><em>EventSubscriber</em></strong> class.</li>\n</ul>\n<h3>A step towards the Event API in practice :)</h3>\n<p><strong>1. Event Dispatcher</strong></p>\n<p>As mentioned earlier, the Event API allows us to propagate an event throughout our site so it can be listened to by a listener.</p>\n<p>Let us create our <em>Custom Events</em> module, which will contain all our Event API work:</p>\n<h5>custom_events.info.yml</h5>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> Custom events\n<span class=\"token key atrule\">type</span><span class=\"token punctuation\">:</span> module\n<span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> Example events dispatcher and subscriber.\n<span class=\"token key atrule\">core</span><span class=\"token punctuation\">:</span> 8.x\t\n<span class=\"token key atrule\">package</span><span class=\"token punctuation\">:</span> Custom</code></pre></div>\n<h3>How to define our own Event?</h3>\n<p>We need to define the event class in the <code class=\"language-text\">src/Event</code> directory within the module root — in our case <code class=\"language-text\">custom_events/src/Event/ExampleEvent.php</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>  \n  \n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>project<span class=\"token punctuation\">\\</span>Event</span><span class=\"token punctuation\">;</span>  \n  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>EventDispatcher<span class=\"token punctuation\">\\</span>Event</span><span class=\"token punctuation\">;</span>  \n  \n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ExampleEvent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Event</span>  \n<span class=\"token punctuation\">{</span>  \n  <span class=\"token keyword\">const</span> <span class=\"token constant\">SUBMIT</span> <span class=\"token operator\">=</span> <span class=\"token single-quoted-string string\">'event.submit'</span><span class=\"token punctuation\">;</span>  \n <span class=\"token keyword\">protected</span> <span class=\"token variable\">$referenceID</span><span class=\"token punctuation\">;</span>  \n  \n <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">__construct</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$referenceID</span><span class=\"token punctuation\">)</span>  \n <span class=\"token punctuation\">{</span>  <span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token property\">referenceID</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$referenceID</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n  \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getReferenceID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n <span class=\"token punctuation\">{</span>  <span class=\"token keyword\">return</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token property\">referenceID</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n  \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">myEventMessage</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>  \n <span class=\"token punctuation\">{</span>  <span class=\"token keyword\">return</span> <span class=\"token double-quoted-string string\">\"This is an example event.\"</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n<span class=\"token punctuation\">}</span></span></code></pre></div>\n<ul>\n<li>Our class must strictly extend the Event class that exists in Drupal core, specifically in the namespace <code class=\"language-text\">Symfony\\Component\\EventDispatcher\\Event</code>.</li>\n<li>Our class can contain our own methods, which will be accessible once our event is dispatched or listened to.</li>\n<li>The constructor defines the <code class=\"language-text\">$referenceID</code> variable, which will be accessible by the Event Subscriber once our event is dispatched.</li>\n</ul>\n<h3>How to DISPATCH our event?</h3>\n<p>This is where the power of the Event API lies — our event can be dispatched from anywhere in our application:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n\n<span class=\"token comment\">// Use our event namespace (ExampleEvent)</span>\n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>example_events<span class=\"token punctuation\">\\</span>ExampleEvent</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Load the event_dispatcher service</span>\n<span class=\"token variable\">$dispatcher</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">service</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'event_dispatcher'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Create a new instance of our event (ExampleEvent) </span>\n<span class=\"token variable\">$event</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ExampleEvent</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$form_state</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'name'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Dispatch the event via the \"dispatch\" method, passing the event name and the '$event' object as parameter. </span>\n\n<span class=\"token variable\">$dispatcher</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">dispatch</span><span class=\"token punctuation\">(</span>ExampleEvent<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">SUBMIT</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$event</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span></code></pre></div>\n<p>The snippet above shows how to dispatch an event from anywhere in your site.</p>\n<p>In this tutorial, we will create a form in which we dispatch our event — specifically in the <code class=\"language-text\">submitForm</code> callback:</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>  \n<span class=\"token comment\">/**  \n * @file  \n  * Contains \\Drupal\\example_events\\Form\\DemoEventDispatchForm.  \n */</span>\n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>project<span class=\"token punctuation\">\\</span>Form</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>Core<span class=\"token punctuation\">\\</span>Form<span class=\"token punctuation\">\\</span>FormBase</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>Core<span class=\"token punctuation\">\\</span>Form<span class=\"token punctuation\">\\</span>FormStateInterface</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>example_events<span class=\"token punctuation\">\\</span>Event<span class=\"token punctuation\">\\</span>ExampleEvent</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">class</span> <span class=\"token class-name\">EventDispatchForm</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">FormBase</span> <span class=\"token punctuation\">{</span>  \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getFormId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token keyword\">return</span> <span class=\"token single-quoted-string string\">'event_dispatch_form'</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">buildForm</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">array</span> <span class=\"token variable\">$form</span><span class=\"token punctuation\">,</span> FormStateInterface <span class=\"token variable\">$form_state</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token variable\">$form</span><span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'reference'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span>  \n      <span class=\"token single-quoted-string string\">'#type'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'textfield'</span><span class=\"token punctuation\">,</span>  \n      <span class=\"token single-quoted-string string\">'#title'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">t</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'Reference'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  \n      <span class=\"token single-quoted-string string\">'#description'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">t</span><span class=\"token punctuation\">(</span><span class=\"token double-quoted-string string\">\"Please write something that will serve as the event object\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  \n      <span class=\"token single-quoted-string string\">'#maxlength'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token number\">64</span><span class=\"token punctuation\">,</span>  \n      <span class=\"token single-quoted-string string\">'#size'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token number\">64</span><span class=\"token punctuation\">,</span>  \n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token variable\">$form</span><span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'dispatch_action'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span>  \n      <span class=\"token single-quoted-string string\">'#type'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token single-quoted-string string\">'submit'</span><span class=\"token punctuation\">,</span>  \n      <span class=\"token single-quoted-string string\">'#value'</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token variable\">$this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">t</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'Dispatch'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  \n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token keyword\">return</span> <span class=\"token variable\">$form</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">submitForm</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">array</span> <span class=\"token operator\">&amp;</span><span class=\"token variable\">$form</span><span class=\"token punctuation\">,</span> FormStateInterface <span class=\"token variable\">$form_state</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token comment\">// Dispatch our event</span>\n    <span class=\"token variable\">$dispatcher</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">service</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'event_dispatcher'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token variable\">$event</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ExampleEvent</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$form_state</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getValue</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'reference'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token variable\">$dispatcher</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">dispatch</span><span class=\"token punctuation\">(</span>ExampleEvent<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">SUBMIT</span><span class=\"token punctuation\">,</span> <span class=\"token variable\">$event</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n<span class=\"token punctuation\">}</span></span></code></pre></div>\n<p>Time to create our first Route, on which we will display our form:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">example_events.event_dispatcher_form</span><span class=\"token punctuation\">:</span>  \n  <span class=\"token key atrule\">path</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'event-dispatch-form'</span>  \n  <span class=\"token key atrule\">defaults</span><span class=\"token punctuation\">:</span>  \n    <span class=\"token key atrule\">_form</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'\\Drupal\\example_events\\Form\\EventDispatchForm'</span>  \n  <span class=\"token key atrule\">_title</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'Event Dispatcher Form'</span>  \n  <span class=\"token key atrule\">requirements</span><span class=\"token punctuation\">:</span>  \n    <span class=\"token key atrule\">_permission</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'access content'</span></code></pre></div>\n<p>So far, we have successfully created our Event and dispatched it when the form is submitted (submitForm callback).</p>\n<p><strong>2. Event Subscriber</strong></p>\n<h3>How to subscribe to our event?</h3>\n<p><strong>2.1 Creating the Event Subscriber class</strong></br>\nLet us now look at how to subscribe to the event we already created (ExampleEvent).</p>\n<p>To subscribe to an existing event, we need to create the Event Subscriber class at <code class=\"language-text\">/ModuleRoot/src/EventSubscriber/</code> — in our example: <code class=\"language-text\">/example_events/src/EventSubscriber/ExampleEventSubscriber</code></p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>  \n<span class=\"token keyword\">namespace</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>example_events<span class=\"token punctuation\">\\</span>EventSubscriber</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>Core<span class=\"token punctuation\">\\</span>Config<span class=\"token punctuation\">\\</span>ConfigCrudEvent</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>Core<span class=\"token punctuation\">\\</span>Config<span class=\"token punctuation\">\\</span>ConfigEvents</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Drupal<span class=\"token punctuation\">\\</span>example_events<span class=\"token punctuation\">\\</span>Event<span class=\"token punctuation\">\\</span>ExampleEvent</span><span class=\"token punctuation\">;</span>  \n<span class=\"token keyword\">use</span> <span class=\"token package\">Symfony<span class=\"token punctuation\">\\</span>Component<span class=\"token punctuation\">\\</span>EventDispatcher<span class=\"token punctuation\">\\</span>EventSubscriberInterface</span><span class=\"token punctuation\">;</span>  \n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">ExampleEventSubscriber</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">EventSubscriberInterface</span> <span class=\"token punctuation\">{</span>  \n\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getSubscribedEvents</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span> \n      ConfigEvents<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">SAVE</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'savingConfig'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">800</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>  \n      ExampleEvent<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token constant\">SUBMIT</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token keyword\">array</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'executeAction'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">800</span><span class=\"token punctuation\">)</span>  \n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>  \n  \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">executeAction</span><span class=\"token punctuation\">(</span>ExampleEvent <span class=\"token variable\">$event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">messenger</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">addStatus</span><span class=\"token punctuation\">(</span><span class=\"token function\">t</span><span class=\"token punctuation\">(</span><span class=\"token double-quoted-string string\">\"You subscribed to the ExampleEvent dispatched when the form was submitted with \"</span> <span class=\"token punctuation\">.</span> <span class=\"token variable\">$event</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getReferenceID</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">.</span> <span class=\"token double-quoted-string string\">\" as the reference.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n  \n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">savingConfig</span><span class=\"token punctuation\">(</span>ConfigCrudEvent <span class=\"token variable\">$event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>  \n    \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">messenger</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">addStatus</span><span class=\"token punctuation\">(</span><span class=\"token function\">t</span><span class=\"token punctuation\">(</span><span class=\"token double-quoted-string string\">\"The configuration \"</span> <span class=\"token punctuation\">.</span> <span class=\"token variable\">$event</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getConfig</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getName</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">.</span> <span class=\"token double-quoted-string string\">\" has been saved.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n  <span class=\"token punctuation\">}</span>  \n<span class=\"token punctuation\">}</span></span></code></pre></div>\n<p>Here is what we did in this class:</p>\n<ul>\n<li>We implemented the <strong>EventSubscriberInterface</strong> and used the namespace <code class=\"language-text\">Symfony\\Component\\EventDispatcher\\EventSubscriberInterface</code>.</li>\n<li>We implemented the <strong>getSubscribedEvents</strong> method from the interface, returning an array with <strong>event name (key) => method name (value) + priority key</strong>.</li>\n</ul>\n<p>You may wonder where <code class=\"language-text\">ConfigEvents::SAVE</code> comes from — it is an existing event dispatched by Drupal core.\nIt is good practice to define new events as constants so they are globally available in our class.</p>\n<p><strong>2.2 Tagging the Event Subscriber class with event_subscriber</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">services</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">example_events.event_subscriber_example</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">class</span><span class=\"token punctuation\">:</span> Drupal\\example_events\\EventSubscriber\\ExampleEventSubscriber\n    <span class=\"token key atrule\">tags</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token punctuation\">{</span> <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'event_subscriber'</span> <span class=\"token punctuation\">}</span></code></pre></div>\n<p>Above, we created our first service <code class=\"language-text\">example_events.event_subscriber_example</code> in <code class=\"language-text\">example_events.services.yml</code> and tagged it with <code class=\"language-text\">event_subscriber</code>, registering our service as an EventSubscriber in the service container.</p>\n<p><strong>Source code available on <a href=\"https://github.com/akramzairig/Event-Api\">Github</a> :)</strong></p>","excerpt":"Drupal has always provided a wealth of hooks that allow specific processing tied to a given action. Before diving into the Event API, it is important to clarify…","frontmatter":{"date":"2019-11-24","metaDate":"2019-11-24","title":"Event API","tags":["Event API","Hooks","Drupal 8","Module development"],"path":"/event-api","cover":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAECBf/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgT/2gAMAwEAAhADEAAAAcu5nbDGM//EABcQAQADAAAAAAAAAAAAAAAAAAAQIUL/2gAIAQEAAQUCnKn/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPwGI/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8Bqv/EABUQAQEAAAAAAAAAAAAAAAAAABAR/9oACAEBAAY/Amv/xAAbEAACAwADAAAAAAAAAAAAAAAAAREhMUFRkf/aAAgBAQABPyFIgZas1kvOBdk/T//aAAwDAQACAAMAAAAQzw//xAAVEQEBAAAAAAAAAAAAAAAAAAAQIf/aAAgBAwEBPxCh/8QAFREBAQAAAAAAAAAAAAAAAAAAECH/2gAIAQIBAT8Qkf/EABoQAQEBAQEBAQAAAAAAAAAAAAERACFBMWH/2gAIAQEAAT8Q/LFhJ324A5Th+hhjpKqGsdDfpG//2Q==","aspectRatio":1.5,"src":"/static/02c52a6255ab81e19850d39b206f6662/88110/listener.jpg","srcSet":"/static/02c52a6255ab81e19850d39b206f6662/0b320/listener.jpg 480w,\n/static/02c52a6255ab81e19850d39b206f6662/60b32/listener.jpg 960w,\n/static/02c52a6255ab81e19850d39b206f6662/88110/listener.jpg 1920w,\n/static/02c52a6255ab81e19850d39b206f6662/40175/listener.jpg 2880w,\n/static/02c52a6255ab81e19850d39b206f6662/e58c2/listener.jpg 3840w,\n/static/02c52a6255ab81e19850d39b206f6662/4bfbc/listener.jpg 6240w","srcWebp":"/static/02c52a6255ab81e19850d39b206f6662/d1a9d/listener.webp","srcSetWebp":"/static/02c52a6255ab81e19850d39b206f6662/bc3bf/listener.webp 480w,\n/static/02c52a6255ab81e19850d39b206f6662/39337/listener.webp 960w,\n/static/02c52a6255ab81e19850d39b206f6662/d1a9d/listener.webp 1920w,\n/static/02c52a6255ab81e19850d39b206f6662/fcbe1/listener.webp 2880w,\n/static/02c52a6255ab81e19850d39b206f6662/c136d/listener.webp 3840w,\n/static/02c52a6255ab81e19850d39b206f6662/5aa0d/listener.webp 6240w","sizes":"(max-width: 1920px) 100vw, 1920px"},"resize":{"src":"/static/02c52a6255ab81e19850d39b206f6662/c4f3a/listener.jpg"}}}}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"pathSlug":"/event-api","locale":"en","prev":null,"next":{"fields":{"locale":"en"},"frontmatter":{"path":"/cache-api","title":"Cache API","tags":["Cache","Performance","Module development","Drupal 8"]}}}}}