Was sind Events?
Ein Ereignis (englisch englisch event) dient in der Softwaretechnik – bei Entwicklung nach dem ereignisorientieren Programmierparadigma – zur Steuerung des Programmflusses. Das Programm wird nicht linear durchlaufen, sondern es werden spezielle Ereignisbehandlungsroutinen (engl. listener, observer, event handler) immer dann ausgeführt, wenn ein bestimmtes Ereignis auftritt. Ereignisorientierte Programmierung gehört zu den parallelen Programmiertechniken, hat also deren Vor- und Nachteile.
(Quelle: Wikipedia)
Integration in brandbox
Der EventHandler steht global in allen Controller-Klassen zur Verfügung. Er liefert den EventDispatcher. Weiterlesen https://symfony.com/doc/current/components/event_dispatcher.html
Ein Event feuern
Die Methode dispatch() benachrichtigt alle Listener und Subscriber über das gegebene Ereignis. Es benötigt zwei Argumente: die Event-Instanz, die an jeden Listener dieses Ereignisses übergeben werden soll, und den Namen des zu versendenden Ereignisses:
Codeblock | ||
---|---|---|
| ||
$event = new Event\TestEvent(); $this ->getEventManager() ->getDispatcher() ->dispatch(Event\TestEvent::class, $event) ; |
TestSubscriber
muss von\Symfony\Component\EventDispatcher\EventSubscriberInterface
ableitenDer Subscriber registriert das Event
Event\TestEvent::class
Der Subscriber muss im Ordner
Lib/Subscriber
liegen
Listener nutzen
Listener liegen in „Lib/Listener/“ und können wie folgt aufgerufen werden:
...
Codeblock | ||
---|---|---|
| ||
class ComponentValidatorSubscriber extends Event\EventSubscriberAbstract { public static function getSubscribedEvents(): array { return [ Event\TestEvent::class => ['onPopulateTest', 800], ]; } public function onPopulateTest(Event\TestEvent $event): void { $this ->staticController(Lib\Listener\Test\PopulateTest::class) ->process($event) ; } } |
Wird im Subscriber auf ein Event verwiesen,
...
das nicht zur Verfügung steht (z.B. weil die App des referenzierten Events nicht installiert ist), wird kein harter Fehler
...
geworfen, sondern ein Debug-Eintrag ins Log geschrieben.
...
Info |
---|
Wichtiger HinweisEvents, Listener und Subscriber dürfen nie außerhalb des Packages und der App aufgerufen oder instanziiert werden. Sie sind nicht Teil der Api. Änderungen an den Klassen gelten nicht als Breaking Change. |
...
Codeblock | ||
---|---|---|
| ||
$this ->getEventHandler() ->getDispatcher() ; |
Debugging
Event-Calls können nachverfolgt werden. Um einen Überblick über den Call-Stack zu erhalten aktivieren Sie in der config.php debug.event
.
Codeblock | ||
---|---|---|
| ||
'debug' => [
'event' => true
] |
Der Call-Stack wird dann im regulären Log dargestellt.
Beispiel
Codeblock |
---|
BRANDBOX.EVENT Event: Brandbox\BaseCore\Base\Edit\Lib\Event\OnPopulateEdit BRANDBOX.EVENT - Listener: Brandbox\ShopVariant\Ui\Variant\Lib\Subscriber\BaseEditSubscriber::setClassificationId BRANDBOX.EVENT - Listener: Brandbox\BaseCore\Base\Localization\Lib\Subscriber\BaseEditSubscriber::onPopulateBuilder BRANDBOX.EVENT - Listener: Brandbox\BaseCore\Base\Localization\Lib\Subscriber\BaseEditSubscriber::onPopulateCollation |
App strukturieren
Die Pfade innerhalb eines Packages sind definiert. Siehe Eine App erstellen