Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

Was sind

...

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 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. listenerobserverevent 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)

...

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

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
languagephp
$event = new Event\TestEvent();
$this
   ->getEventManager()
   ->getDispatcher()
   ->dispatch(Event\TestEvent::NAME, $event)
;
  • TestSubscriber muss von \Symfony\Component\EventDispatcher\EventSubscriberInterface ableiten

  • Der Subscriber registriert das Event

     Event

    Event\TestEvent::

    NAME

    class

  • Der Subscriber muss im Ordner Lib/Subscriber liegen

Subscriber nutzen

...

Listener nutzen

Listener liegen in „Lib/Listener/“ und können wie folgt aufgerufen werden:

Codeblock
languagephp
$listener = new TestListener();
$this
   ->getEventManager()
   ->addListener(Lib\Listener\Test\PopulateTest::class, [$listener, 'process'])
; 

Subscriber nutzen

Bei der Nutzung von Subscribern verzichten wir auf den Aufruf von „addListener“ und nutzen die EventSubscriber-Klassen in „Lib/Subscriber/“ um unsere Event-Listener zu registrieren:

Codeblock
languagephp
class ComponentValidatorSubscriber extends Event\EventSubscriberAbstract
{
    public static function getSubscribedEvents(): array
    {
        return [
            Event\TestEvent::NAMEclass => ['onPopulateTest', 800],
        ];
    }

    public function onPopulateTest(Event\TestEvent $event): void
    {
        $this
            ->staticController(Lib\Listener\Test\PopulateTest::class)
            ->process($event)
        ;
    }
}
Info
titleWichtiger Hinweis

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 Hinweis

Events, Listener und Subscriber dürfen nie außerhalb des Packges Packages und der App aufgerufen oder instanziiert werden. Sie sind nicht Teil der Api. Änderungen an Listenern und Subscribern den Klassen gelten nicht als Breaking Change.

...

Codeblock
languagephp
$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
languagephp
'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