So verwenden Sie den Symfony Event Dispatcher für PHP

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.

Was ist die Symfony Event Dispatcher-Komponente??

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.

Event Dispatcher installieren und konfigurieren

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.

Erstellen, Versenden und Abhören von Ereignissen

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.

Die Eventklasse

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.

Die Listener-Klasse

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.

Eine Beispieldatei

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.

Was ist ein Event-Abonnent??

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.

Die Abonnentenklasse

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.

Eine Beispieldatei

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.

Fazit

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!