Was sind Hooks?
Hook (englisch für Haken, auch Einschubmethode genannt) bezeichnet in der Programmierung eine Schnittstelle, mit der fremder Programmcode in eine bestehende Anwendung integriert werden kann, um diese zu erweitern, deren Ablauf zu verändern oder um bestimmte Ereignisse abzufangen. Dies kann entweder im Quelltext geschehen, der entsprechend modifiziert wird, über Konfigurationsdateien, die den Ablauf eines fertigen Programms verändern, oder über Aufruf von Funktionen, denen der auszuführende Programmcode in irgendeiner Form mitgegeben wird.
(Quelle: Wikipedia)
Was sind Events?
Ein Ereignis (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)
EventDispatcher
Mit brandbox 5.3 wurde das bestehende Hook-System als deprecated markiert. An diese Stelle rückt der EventDispatcher aus dem Symfony-Framework. Mit dem EventDispatcher ist es nun möglich Events und Hooks mit definierten Interfaces zu erstellen. Das soll dazu führen dass die Fehlerquote deutlich sinkt.
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
$event = new Event\TestEvent(); $this ->getEventManager() ->dispatch(Event\TestEvent::NAME, $event) ;
TestSubscriber
muss von\Symfony\Component\EventDispatcher\EventSubscriberInterface
ableiten- Der Subscriber registriert das Event
Event\TestEvent::NAME
- Der Subscriber muss im Ordner
Lib/Subscriber
liegen
Subscriber nutzen
Die Methode dispatch() benachrichtigt alle Listener (bzw. 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:
class ComponentValidatorSubscriber extends Event\EventSubscriberAbstract { public static function getSubscribedEvents(): array { return [ Event\TestEvent::NAME => ['onPopulateTest', 800], ]; } public function onPopulateTest(Event\TestEvent $event): void { $this ->staticController(Lib\Listener\Test\PopulateTest::class) ->process($event) ; } }
Wichtiger Hinweis
Subscriber dürfen nie außerhalb des Packges und der App aufgerufen werden. Sie sind nicht Teil der Api. Änderungen an Listenern und Subscribern gelten nicht als Breaking Change.
Umgang mit Events
Der eventDispatcher
kann in jeder Controller-Klasse direkt genutzt werden. Der EventHandler
stellt die Funktionen des Dispatcher wie folgt zur Verfügung.
$this ->getEventHandler() ->getDispatcher() ;
App strukturieren
Die Pfade innerhalb eines Packages sind definiert. Siehe Eine App erstellen