{"componentChunkName":"component---src-templates-post-jsx","path":"/fr/event-api","result":{"data":{"markdownRemark":{"html":"<p>Depuis toujours , Drupal fournit une multitude de hooks qui donnent la possibilité de procéder à un traitement spécifique lié à une action donnée.</p>\n<p>Avant d'attaquer l'Api Event, Il faut préciser que les hooks ne sont que des fonctions PHP qui permettent d’interagir avec le cœur, les modules ainsi que les thèmes de Drupal.</p>\n<p><strong><em>Exemple des 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>Dans cet exemple, le <em>hook<em>ENTITY</em>insert</em> nous a permis d'interagir avec l'entité Node, en modifiant cette dernière avant qu'elle soit sauvegardée dans la base de donnée.\nIl faut pas nier que le système des hooks est surpuissant, vous allez vous demander pourquoi alors adopter l'API Event !</p>\n<h2>Après l'arrivée de Drupal 8 ....</h2>\n<p>Comme on l'avait vu dans la section précédente; le système des hooks à fait ses preuves dans les anciennes versions de Drupal, mais avec l'arrivée de Drupal 8, le plus grand défi était de refaire le CMS d'une façon à ce qu'il adopte le paradigme d'orienté objet, dans ce cadre Drupal a introduit l'API Event de Symfony dans sa version 8 toute en gardant le système des hooks qui est supposé être totalement supprimer dans la version 9 de Drupal.</p>\n<h3>Mais comment peut-on utiliser l'API Event sur Drupal 8 ?</h3>\n<p>Théoriquement, il existe un registre d'événements appelé <strong><em>Event Registry</em></strong> </p>\n<ul>\n<li>On peut déclarer ou diffuser un événement dans l'Event Registry pour permettre aux autres modules d'intervenir et changer notre propre module toute en utilisant la classe <strong><em>EventDispatcher</em></strong>.</li>\n<li>On peut souscrire à un événement de l'Event Registry; c'est à dire écouter ou surveiller un événement donné pour déclencher une action précise en utilisant la classe <strong><em>EventSubscriber</em></strong>. </li>\n</ul>\n<h3>Un pas vers la pratique de l'API Event :)</h3>\n<p><strong>1. Event dispatcher</strong></p>\n<p>Comme on l'avait déjà cité, l'API Event nous permet de propager un événement dans notre site afin qu'on puisse l'écouter par un listener </p>\n<p>Créons ensemble notre module <em>Custom events</em> qui va contenir tous nos travaux sur l'Event API:</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 distpacher 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>Comment définir notre propre Événement ?</h3>\n<p>Il faut définir la classe d'événement dans le répertoire <code class=\"language-text\">src/Event</code> dans la racine du module, dans notre cas c'est <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\">\"Ceci est un exemple d'événement.\"</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>Il faut que notre classe hérite strictement de la classe Event qui existe dans le cœur de Drupal et notamment dans ce namespace <code class=\"language-text\">Symfony\\Component\\EventDispatcher\\Event</code></li>\n<li>Notre classe peut contenir nos propres méthodes qui seront accessible par la suite une fois notre événement est propagé ou écouté.</li>\n<li>Le constructeur sert à définir la variable $referenceID qui va être accessible par l'Event Subscriber, une fois notre événement est propagé le constructeur va prendre l'ID $referenceID.</li>\n</ul>\n<h3>Comment DISPATCHER notre événement ?</h3>\n<p>C'est ici que se cache la puissance de API Event, notre événement peut être propager n'importe où dans notre application, comment? voyons voir ensemble :</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\">// On utilise le namespace de notre event (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\">// On charge le service event_dispatcher</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\">// On crée une nouvelle instance de notre 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\">// On dispatche l'événement via la méthode \"dispatch\" et on passe dedant le nom de l'événement qu'on souhaite propager et l'objet d'événement '$event' comme paramètre. </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>Le code snippet si-dessus montre comment dispatcher un événement n'importe où dans notre site.</p>\n<p>Dans ce tutoriel, on va créer un formulaire dans lequel on dispatchera notre événement et plus précisément dans le callback submitForm, on verra ça toute de suite :</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 comment\">/**  \n * Class DemoEventDispatchForm. \n *  \n * @package Drupal\\example_events\\Form  \n */</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 comment\">/**  \n * {@inheritdoc}  \n */</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 comment\">/**  \n * {@inheritdoc}  \n */</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\">\"Veuillez écrire quelque chose qui servira comme object d'événement\"</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\">'Dispatcher'</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 comment\">/**  \n * {@inheritdoc}  \n */</span>  \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  \n  <span class=\"token comment\">// On dispatche notre événement</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>Il est temps de créer notre première Route sur laquelle on affichera notre formulaire:</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>Parfait, jusqu'ici nous avons réussi à créer notre Event et le dispatcher une fois que notre formulaire est enregistré (submitForm callback).</p>\n<p><strong>2. Event Subscriber</strong></p>\n<h3>Comment souscrire à notre événement ?</h3>\n<p><strong>2.1 Création de la classe de l'Event Subscriber</strong></br>\nRegardons ensemble maintenant comment on peut souscrire à l'événement qu'on a déjà créé (ExampleEvent).</p>\n<p>Pour souscrire à un événement existant, il faudra créer la classe de l'Event Subscriber sur <code class=\"language-text\">/ModuleRacine/src/EventSubscriber/</code>, dans notre example c'est sur <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 comment\">/**  \n * @file  \n  * Contains \\Drupal\\project\\ExampleEventSubscriber.  \n */</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 comment\">/**  \n * Class ExampleEventSubscriber. \n */</span>\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 comment\">/**  \n * {@inheritdoc}  \n */</span>  \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\t<span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span> \n\t  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\t  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\t <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n <span class=\"token punctuation\">}</span>  \n  \n <span class=\"token comment\">/**  \n * Subscriber Callback for the event. \n */</span>  \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\">\"Vous avez souscrit à l'événement ExampleEvent qui a été dispatché lors de l'enregistrement du formulaire avec \"</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\">\" comme référence \"</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 comment\">/**  \n * Subscriber Callback for the event.\n */</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\">\"La 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\">\" a été sauvegardée\"</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>Top, regardons ensemble ce qu'on a fait dans cette classe :</p>\n<ul>\n<li>Nous avons implémenté l'interface <strong>EventSubscriberInterface</strong> et utiliser le namespace <code class=\"language-text\">Symfony\\Component\\EventDispatcher\\EventSubscriberInterface</code>.</li>\n<li>Nous avons implémenté la méthode <strong>getSubscribedEvents</strong> qui existe dans l'interface déjà implémentée, et on a mit comme résultat un tableau qui contient <strong>le nom d’événement (clé) => le nom de méthode qui convient (valeur) + la clé de priorité.</strong></li>\n</ul>\n<p>Vous allez certainement vous demander d’où vient <code class=\"language-text\">ConfigEvents::SAVE</code>; c'est un événement existant par défaut dispatché par le cœur de Drupal.\nC'est une bonne pratique de définir les nouveaux événements qu'on est entrain de créer comme des constantes pour qu'ils soient globalement disponibles dans notre classe.</p>\n<p><strong>2.2 Taguer la classe de l'Event Subscriber par 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>Ci-dessus nous avons créer notre premier service <code class=\"language-text\">example_events.event_subscriber_example</code> dans <code class=\"language-text\">example_events.services.yml</code> et on a tagué ce dernier par <code class=\"language-text\">event_subscriber</code>, comme ça notre service est enregistré comme un EventSubscriber dans le service container.</p>\n<p>Voici à quoi ressemble notre formulaire après enregistrement d'une référence:</p>\n<p><img src=\"https://res.cloudinary.com/drjmnmmvw/image/upload/v1574534376/event_api1_gcs9ip.png\"></p>\n<p><strong>Code source du module disponible sur <a href=\"https://github.com/akramzairig/Event-Api\">Github</a> :)</strong></p>","excerpt":"Depuis toujours , Drupal fournit une multitude de hooks qui donnent la possibilité de procéder à un traitement spécifique lié à une action donnée. Avant d…","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":"fr","prev":null,"next":{"fields":{"locale":"fr"},"frontmatter":{"path":"/cache-api","title":"Cache API","tags":["Cache","Performance","Module development","Drupal 8"]}}}}}