Heute lernen wir, wie Sie die Symfony Event Dispatcher-Komponente verwenden, mit der Sie Ereignisse und Listener in Ihren PHP-Anwendungen erstellen können. So können verschiedene Komponenten Ihrer Anwendung mit locker gekoppeltem Code miteinander kommunizieren.
Sie sind möglicherweise mit dem Ereignis-Beobachter-Muster vertraut, mit dem Sie Listener für vom System erzeugte Ereignisse definieren können, damit diese ausgeführt werden, wenn das Ereignis ausgelöst wird. In ähnlicher Weise können Sie mit der Symfony EventDispatcher-Komponente ein System einrichten, in dem Sie benutzerdefinierte Ereignisse und Listener erstellen können. Auf diese Weise lassen Sie Komponenten in Ihrer Anwendung reagieren, wenn etwas geschieht in einem System.
Die Event-Dispatcher-Komponente enthält drei Elemente, mit denen Sie Ihre App-Architektur aufbauen können:Ereignis, Listener und Dispatcher. Das gesamte System wird von der Dispatcher-Klasse orchestriert, die an geeigneten Stellen in einer Anwendung Ereignisse auslöst und mit diesen Ereignissen verknüpfte Listener aufruft.
Nehmen wir an, Sie möchten, dass andere Komponenten in Ihrer Anwendung reagieren, wenn der Cache gelöscht wird. In diesem Fall müssen Sie zunächst das Clear-Cache-Ereignis definieren. Nachdem der Cache gelöscht wurde, können Sie den Dispatcher verwenden, um das Clear-Cache-Ereignis auszulösen. Dadurch werden alle Listener benachrichtigt, die dieses Ereignis abhören. Dies gibt den Hörern die Möglichkeit, komponentenspezifische Caches zu löschen.
In diesem Artikel werden die Grundlagen der Event-Dispatcher-Komponente erläutert. Wir beginnen mit der Installation und Konfiguration und erstellen einige praktische Beispiele, um alle oben genannten Konzepte zu veranschaulichen.
In diesem Abschnitt installieren wir die Event-Dispatcher-Komponente. Ich gehe davon aus, dass Sie Composer bereits auf Ihrem System installiert haben, da wir ihn zur Installation der EventDispatcher-Komponente benötigen.
Nachdem Sie Composer installiert haben, installieren Sie die EventDispatcher-Komponente mit dem folgenden Befehl.
$ composer benötigt einen Symfony / Event-Dispatcher
Das hätte das schaffen sollen composer.json Datei, die so aussehen sollte:
"required": "symfony / event-dispatcher": "^ 4.1"
Lassen Sie uns das weiter bearbeiten composer.json Datei wie folgt aussehen:
"required": "symfony / event-dispatcher": "^ 4.1", "autoload": "psr-4": "EventDispatchers \\": "src", "classmap": ["src "]
Da wir einen neuen Classmap-Eintrag hinzugefügt haben, aktualisieren Sie den Composer-Autoloader, indem Sie den folgenden Befehl ausführen.
$ composer dump -o
Jetzt können Sie die EventDispatcher
Namespace zum automatischen Laden von Klassen unter src Verzeichnis.
Das ist also der Installationsteil, aber wie soll man es verwenden? In der Tat ist es nur eine Frage der Einbeziehung der autoload.php Datei, die von Composer in Ihrer Anwendung erstellt wurde, wie im folgenden Snippet gezeigt.
In diesem Abschnitt wird ein Beispiel beschrieben, in dem gezeigt wird, wie Sie ein benutzerdefiniertes Ereignis erstellen und einen Listener für dieses Ereignis einrichten können.
Beginnen Sie mit dem Erstellen des src / Events / DemoEvent.php Datei mit folgendem Inhalt.
foo = 'bar'; public function getFoo () return $ this-> foo;
Unsere Gewohnheit DemoEvent
Klasse erweitert den Kern Veranstaltung
Klasse der EventDispatcher-Komponente. Das NAME
konstant hält den Namen unserer benutzerdefinierten Veranstaltung-demo.event
. Wird verwendet, wenn Sie einen Listener für dieses Ereignis einrichten möchten.
Als Nächstes erstellen wir die Listener-Klasse src / Listeners / DemoListener.php mit folgenden Inhalten.
getFoo (). "\ n";
Das DemoListener
Klasse implementiert die onDemoEvent
Methode, die ausgelöst wird, wenn das System den DemoEvent
Veranstaltung. Natürlich geschieht das noch nicht automatisch, da wir das registrieren müssen DemoListener
Hörer das zu hören demo.event
Ereignis mit der EventDispatcher-Klasse.
Bisher haben wir Ereignis- und Listenerklassen erstellt. Als nächstes werden wir sehen, wie man all diese Teile zusammenbindet.
Lass uns die erstellen basic_example.php Datei mit folgendem Inhalt.
addListener ('demo.event', array ($ listener, 'onDemoEvent')); // dispatch $ dispatcher-> dispatch (DemoEvent :: NAME, neues DemoEvent ());
Das EventDispatcher
class ist das wichtigste Element in der EventDispatcher-Komponente. Mit ihr können Listener an Ereignisse gebunden werden, die sie hören möchten. Wir haben die verwendet addListener
Methode der EventDispatcher
Klasse zu hören demo.event
Veranstaltung.
Das erste Argument der addListener
method ist ein Ereignisname und das zweite Argument ist das aufrufbare PHP, das ausgelöst wird, wenn das registrierte Ereignis ausgelöst wird. In unserem Fall haben wir das bereitgestellt DemoListener
Objekt als Listener zusammen mit dem onDemoEvent
Methode.
$ dispatcher-> addListener ('demo.event', array ($ listener, 'onDemoEvent'));
Schließlich haben wir die verwendet Versand
Methode der EventDispatcher
Klasse zum Versand der demo.event
Veranstaltung.
$ dispatcher-> dispatch (DemoEvent :: NAME, neues DemoEvent ());
Wenn Sie das ausführen basic_example.php Datei sollte die folgende Ausgabe erzeugen.
$ php basic_example.php DemoListener heißt! Der Wert des Foo ist: bar
Wie erwartet die onDemoEvent
Methode der DemoListener
Klasse wird aufgerufen, und das wiederum ruft die getFoo
Methode der DemoEvent
Klasse, um die ereignisbezogenen Informationen abzurufen.
Im vorherigen Abschnitt haben wir ein Beispiel erstellt, in dem gezeigt wurde, wie ein benutzerdefiniertes Ereignis und ein benutzerdefinierter Listener erstellt werden. Wir haben auch besprochen, wie man einen Listener mit dem spezifischen Ereignis binden kann EventDispatcher
Klasse.
Das war ein einfaches Beispiel, da wir nur einen Listener für ein einzelnes Ereignis einrichten wollten. Wenn Sie dagegen Listener für mehrere Ereignisse einrichten möchten oder die Ereignisbehandlungslogik in einer einzigen Klasse logisch gruppieren möchten, sollten Sie die Verwendung von Ereignisabonnenten in Betracht ziehen, da damit alles an einem Ort aufbewahrt werden kann.
In diesem Abschnitt werden wir das im vorherigen Abschnitt erstellte Beispiel überarbeiten.
Das erste, was wir tun müssen, ist die Erstellung einer Abonnentenklasse, die das implementiert EventSubscriberInterface
Schnittstelle. Mach weiter und erstelle das src / Subsribers / DemoSubscriber.php klasse wie im folgenden snippet gezeigt.
'onDemoEvent',); public function onDemoEvent (DemoEvent $ event) // Ereignisinformationen hier abrufen echo "DemoListener heißt! \ n"; echo "Der Wert von foo ist:" $ event-> getFoo (). "\ n";
Seit der Klasse DemoSubscriber
implementiert die EventSubscriberInterface
Schnittstelle muss das implementieren getSubscribeEvents
Methode. Das getSubscribeEvents
Die Methode sollte ein Array von Ereignissen zurückgeben, die Sie abonnieren möchten. Sie müssen den Ereignisnamen in einem Array-Schlüssel und den Methodennamen in einem Array-Wert angeben, der aufgerufen wird, wenn das Ereignis ausgelöst wird.
Als letztes implementieren Sie die Listener-Methode in derselben Klasse. In unserem Fall müssen wir das implementieren onDemoEvent
Methode, und das haben wir bereits getan.
Es ist Zeit, unseren Abonnenten zu testen! Lass uns schnell das erstellen subscriber_example.php Datei mit folgendem Inhalt.
addSubscriber ($ subscriber); // dispatch $ dispatcher-> dispatch (DemoEvent :: NAME, neues DemoEvent ());
Sie müssen das verwenden addSubscriber
Methode der EventDispatcher
Klasse, um Ihren benutzerdefinierten Abonnenten zu abonnieren, und die EventDispatcher
Die Klasse kümmert sich um den Rest. Es holt die zu abonnierenden Ereignisse aus dem getSubscribeEvents
Methode und richtet Listener für diese Ereignisse ein. Abgesehen davon ist alles das gleiche und es sollte ohne Überraschungen wie erwartet funktionieren.
Lass es uns testen!
$ php subscriber_example.php DemoListener heißt! Der Wert des Foo ist: bar
Und das war ein Event-Abonnent zu Ihrer Verfügung! Damit sind wir auch am Ende dieses Artikels.
Heute haben wir uns mit der Symfony Event Dispatcher-Komponente befasst, mit der Sie Ereignisse und Listener in Ihren PHP-Anwendungen einrichten können. Mit dieser Bibliothek können Sie ein lose gekoppeltes System erstellen, mit dem die Komponenten Ihrer Anwendung mühelos miteinander kommunizieren können.
Fühlen Sie sich frei, Ihre Gedanken und Fragen mit dem untenstehenden Formular zu teilen!