Symfony po krůčkách – Event Dispatcher

Dnes se spolu podíváme na EventDispatcher. Jde o komponentu, která dodá tvému kódu flexibilitu. Zároveň je jednou z nejdůležitějších součástek životního cyklu Symfony. Když pochopíš EventDispatcher, budeš zase o kousek blíž k tomu stát se opravdovým mistrem Symfony.

Seriál: Symfony po krůčkách (18 dílů)

  1. Symfony po krůčkách – Event Dispatcher 30.11.2015
  2. Symfony Console jako první rande se Symfony 7.12.2015
  3. Symfony po krůčkách – Filesystem a Finder 14.12.2015
  4. Symfony po krůčkách – Paralýza možností? OptionsResolver tě zachrání 21.12.2015
  5. Symfony po krůčkách – spouštíme procesy 4.1.2016
  6. Symfony po krůčkách – Translation – překlady jednoduše 11.1.2016
  7. Symfony po krůčkách – Validator (1) 18.1.2016
  8. Symfony po krůčkách – Validator (2) 25.1.2016
  9. Symfony po krůčkách – Routing 1.2.2016
  10. Symfony po krůčkách – MicroKernel 9.2.2016
  11. Konfigurujeme Symfony pomocí YAMLu 16.2.2016
  12. Symfony po krůčkách – oblékáme MicroKernel 23.2.2016
  13. Symfony po krůčkách – ClassLoader 29.2.2016
  14. Symfony po krůčkách – Twig 8.3.2016
  15. Symfony po krůčkách – Twig II. 15.3.2016
  16. Symfony po krůčkách – DomCrawler a CssSelector 23.3.2016
  17. Symfony po krůčkách – HTTP fundamentalista 12.4.2016
  18. Symfony po krůčkách – ušli jsme pořádný kus 19.4.2016

„Cesta dlouhá tisíc mil začíná prvním krokem.“                                                                                                                      Confucius

Hlavní pojmy

Event

…neboli událost. Jde o něco, co může nastat při běhu aplikace. Typickým příkladem je objednávka. Když dojde k odeslání objednávky, tak se zavolá Event. Na Event odeslání objednávky pak může slyšet několik EventSubscriberů.

EventSubscriber

…může poslat e-mail adminovi, přičíst kredity za úspěšný nákup, nebo poslat informační sms do skladu s pokynem k zabalení tvých vánočních dárků.

EventDispatcher

ten se stará o zavolání EventSubscriberů, když nastane určitý Event.

Kde můžeš EventDispatcher najít?

Co ti EventDispatcher umožní?

  • Dostat se na určité místo v kódu bez nutnosti jeho změny
  • Zvýšit flexibilitu a použitelnost tvé aplikace

Jak to aplikovat v kódu?

Symfony\EventDispatcher nainstaluješ pomocí Composeru:

$ composer require symfony/event-dispatcher

Vytvoříš si souborindex.php

<?php

require_once __DIR__ . '/vendor/autoload.php';

$eventDispatcher = new Symfony\Component\EventDispatcher\EventDispatcher;
// dispatchneme event někde v kódu na konci objednávky 
$eventDispatcher->dispatch('order.finish');

A spustíš:

$ php index.php

Dispatchneš Event, ale nic se nestane. Aby se něco stalo, bude potřeba ještě EventSubscriber – ten bude naslouchat na order.finish.

Přidáš tedy EventSubscriber.

<?php

class SendEmailToAdminEventSubscriber implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
   public $signal = 0;

   public static function getSubscribedEvents()
   {
      // tady budeme poslouchat "order.finish" event
      // a pokud nastane, použijeme metodu sendEmailToAdmin()
       return ['order.finish' => 'sendEmailToAdmin'];
   }

   public function sendEmailToAdmin()
   {
      // náš kód, který pošle e-mail adminovi
       $this->signal = 1;
   }
}

Nakonec přidáš EventSubscriber do EventDispatcheru:

<?php

$sendEmailToAdminEventSubscriber = new SendEmailToAdminEventSubscriber;

$eventDispatcher = new Symfony\Component\EventDispatcher\EventDispatcher;
$eventDispatcher->addSubscriber($sendEmailToAdminEventSubscriber);

var_dump($sendEmailToAdminEventSubscriber->signal);

$eventDispatcher->dispatch('order.finish');

var_dump($sendEmailToAdminEventSubscriber->signal);

A opět spustíš:

$ php index.php
int(0)
int(1)

Teď, když se ti dispatchne order.finish Event, zavolá se každý EventSubcriber, který se k němu zapsal. V něm se zavolá metoda, která je k němu přiřazena. Dojde tak ke změně $signal z 0 na 1.

Pro tip: Metoda getSubscribedEvents() může naslouchat více Eventům, více metodami. Může také určovat jejich pořadí.

Nyní už rozumíš Symfony komponentě EventDispatcher.

Event s argumenty

Při volání události obvykle potřebuješ předat i nějaká data. Například číslo objednávky. Taková třída Event je vlastně pouhý Value object – schránka na data.

<?php

class OrderEvent extends Symfony\Component\EventDispatcher\Event
{
   private $orderId;

   public function __construct($orderId)
   {
       $this->orderId = $orderId;
   }

   public function getOrderId()
   {
       return $this->orderId;
   }
}

Dispatchneš event i s potřebnými daty.

<?php

$orderEvent = new OrderEvent(123);
$eventDispatcher->dispatch('order.finish', $orderEvent);

Rozšíříš EventSubscriber o OrderEvent:

<?php

class SendEmailToAdminEventSubscriber
    implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
   public $signal = 0;

   public static function getSubscribedEvents()
   {
       return ['order.finish' => 'sendEmailToAdmin'];
   }

   public function sendEmailToAdmin(OrderEvent $orderEvent)
   {
       $this->signal = $orderEvent->getOrderId();
   }
}

A doplníš svůj výsledný kód:

$eventDispatcher = new Symfony\Component\EventDispatcher\EventDispatcher;
$sendEmailToAdminEventSubscriber = new SendEmailToAdminEventSubscriber;
$eventDispatcher->addSubscriber($sendEmailToAdminEventSubscriber);

var_dump($sendEmailToAdminEventSubscriber->signal);

$orderEvent = new OrderEvent(123);
$eventDispatcher->dispatch('order.finish', $orderEvent);

var_dump($sendEmailToAdminEventSubscriber->signal);

Výstup pak vypadá takto:

$  event-dispatcher  php index.php
int(0)
int(123)

 

Jsi zase o krok dál

Teď už:

  • rozumíš základním workflow událostí
  • znáš pojmy Event, EventSubscriber a EventDispatcher
  • víš, k čemu využít vlastní Event objekt
  • …a umíš použít EventDispatcher prakticky ve svém kódu

 

Potřebuješ víc?

Pokud bys potřeboval jít ve vysvětlování do větší hloubky, mrkni na oficiální dokumentaci EventDispatcheru.

Už v Symfony děláš léta a chceš posdílet zkušenosti?

Nebo tě Symfony zatím jen láká a rád by se o něm dozvěděl více? Přijd si pokecat na pravidelné měsíční srazy v Praze a Brně.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 14

Přehled komentářů

zemistr Proč jako první začít s eventy?
Tomáš Votruba Eventy jsou nejmocnější nástroj
zemistr Re: Eventy jsou nejmocnější nástroj
lenoch
HonzaMarek Re:
lenoch Re:
Re:
lenoch Re:
Re:
lenoch Re:
Tomáš Votruba Re: Co to přinese?
lenoch Re: Co to přinese?
Tomáš Votruba Re: Kód se čte 10x častěji než píše
lenoch Re: Kód se čte 10x častěji než píše
Zdroj: https://www.zdrojak.cz/?p=16585