Vandaag gaan we leren hoe je de Symfony-gebeurtenis dispatcher-component kunt gebruiken, waarmee je evenementen en luisteraars in je PHP-applicaties kunt maken. Dus, verschillende componenten van uw applicatie kunnen met elkaar praten met losjes gekoppelde code.
U bent misschien bekend met het patroon van gebeurteniswaarnemers, waarmee u luisteraars kunt definiëren voor door het systeem gegenereerde gebeurtenissen, zodat ze worden uitgevoerd wanneer de gebeurtenis wordt geactiveerd. Op dezelfde manier kunt u met de Symfony EventDispatcher-component een systeem opzetten waarin u aangepaste evenementen en luisteraars kunt maken. Op die manier geeft u toe dat componenten in uw toepassing reageren als iets gebeurt in een systeem.
In feite biedt de gebeurtenisverdelercomponent drie elementen waarmee u uw app-architectuur kunt bouwen:gebeurtenis, luisteraar en coördinator. Het hele systeem wordt georkestreerd door de dispatcher-klasse, die gebeurtenissen op gepaste punten in een toepassing oproept en luisteraars die aan deze evenementen zijn gekoppeld, oproept..
Laten we aannemen dat je andere componenten in je applicatie wilt laten reageren wanneer de cache wordt gewist. In dat geval moet u de clear cache-gebeurtenis op de eerste plaats definiëren. Nadat de cache is gewist, kunt u de dispatcher gebruiken om de clear cache -gebeurtenis op te heffen, en dat meldt alle luisteraars die naar deze gebeurtenis luisteren. Dit geeft luisteraars de mogelijkheid om component-specifieke caches te zuiveren.
In dit artikel zullen we de basisprincipes van de gebeurtenisverdelercomponent verkennen. We beginnen met de installatie en configuratie, en we zullen ook een paar voorbeelden uit de praktijk creëren om alle bovengenoemde concepten te demonstreren.
In deze sectie gaan we de component gebeurtenisverzender installeren. Ik ga ervan uit dat Composer al op uw systeem is geïnstalleerd, omdat we het nodig hebben om de component EventDispatcher te installeren.
Nadat u Composer hebt geïnstalleerd, kunt u de component EventDispatcher installeren met behulp van de volgende opdracht.
$ composer vereist symfony / event-dispatcher
Dat zou de composer.json bestand, dat er als volgt uit moet zien:
"require": "symfony / event-dispatcher": "^ 4.1"
Laten we de. Verder bewerken composer.json bestand om er als volgt uit te zien:
"require": "symfony / event-dispatcher": "^ 4.1", "autoload": "psr-4": "EventDispatchers \\": "src", "classmap": ["src "]
Aangezien we een nieuw item in de classmap hebben toegevoegd, moet je doorgaan en de Composer-autoloader bijwerken door de volgende opdracht uit te voeren.
$ composer dump -o
Nu kunt u de EventDispatchers
naamruimte om klassen autoload onder de src directory.
Dus dat is het installatiedeel, maar hoe moet je het gebruiken? In feite is het gewoon een kwestie van het opnemen van de autoload.php bestand gemaakt door Composer in uw toepassing, zoals getoond in het volgende fragment.
In deze sectie gaan we door een voorbeeld dat laat zien hoe u een aangepaste gebeurtenis kunt maken en een luisteraar voor die gebeurtenis kunt instellen.
Om te beginnen, ga je gang en maak je de src / Events / DemoEvent.php bestand met de volgende inhoud.
foo = 'balk'; openbare functie getFoo () return $ this-> foo;
Onze gewoonte DemoEvent
klasse breidt de kern uit Evenement
klasse van de component EventDispatcher. De NAAM
constante bevat de naam van ons aangepaste evenement-demo.event
. Het wordt gebruikt wanneer u een luisteraar voor dit evenement wilt instellen.
Laten we vervolgens de listenerklasse maken src / Luisteraars / DemoListener.php met de volgende inhoud.
getFoo () "\ n".
De DemoListener
klasse implementeert de onDemoEvent
methode die wordt geactiveerd wanneer het systeem de DemoEvent
evenement. Natuurlijk gebeurt dit nog niet automatisch, omdat we het moeten registreren DemoListener
luisteraar om te luisteren naar de demo.event
gebeurtenis met behulp van de klasse EventDispatcher.
Tot nu toe hebben we event- en listenerklassen gemaakt. Vervolgens zullen we zien hoe we al deze stukken samen kunnen binden.
Laten we het maken basic_example.php bestand met de volgende inhoud.
addListener ('demo.event', array ($ listener, 'onDemoEvent')); // verzending $ dispatcher-> verzending (DemoEvent :: NAME, nieuwe DemoEvent ());
De EventDispatcher
class is het belangrijkste element in de EventDispatcher-component. Hiermee kun je luisteraars binden aan evenementen waarnaar ze willen luisteren. We hebben de addListener
methode van de EventDispatcher
klas om naar te luisteren demo.event
evenement.
Het eerste argument van de addListener
methode is een gebeurtenisnaam en het tweede argument is de PHP-opvraagbare oproep die wordt geactiveerd wanneer de geregistreerde gebeurtenis wordt verzonden. In ons geval hebben we de DemoListener
object als luisteraar samen met de onDemoEvent
methode.
$ dispatcher-> addListener ('demo.event', array ($ listener, 'onDemoEvent'));
Ten slotte hebben we de verzending
methode van de EventDispatcher
klasse om de demo.event
evenement.
$ dispatcher-> dispatch (DemoEvent :: NAME, nieuwe DemoEvent ());
Wanneer u de basic_example.php bestand, zou het de volgende uitvoer moeten produceren.
$ php basic_example.php DemoListener heet! De waarde van de foo is: bar
Zoals verwacht, de onDemoEvent
methode van de DemoListener
class is called, en dat roept op zijn beurt de getFoo
methode van de DemoEvent
klasse om de gebeurtenisgerelateerde informatie op te halen.
In de vorige sectie hebben we een voorbeeld gebouwd dat aantoonde hoe een aangepaste gebeurtenis en een aangepaste luisteraar te maken. We hebben ook besproken hoe een luisteraar aan de specifieke gebeurtenis kan worden gekoppeld met behulp van de EventDispatcher
klasse.
Dat was een eenvoudig voorbeeld, we wilden alleen een luisteraar instellen voor een enkele gebeurtenis. Aan de andere kant, als u luisteraars wilt instellen voor meerdere evenementen of logica voor gebeurtenisafhandeling logisch wilt groeperen in één klasse, zou u moeten overwegen om evenementabonnees te gebruiken omdat ze u in staat stellen om alles op één plek te houden.
In deze sectie zullen we het voorbeeld dat in de vorige sectie werd gemaakt, herzien.
Het eerste dat we moeten doen, is een abonneeklasse maken die de. Implementeert EventSubscriberInterface
interface. Ga je gang en maak de src / Subsribers / DemoSubscriber.php klasse zoals getoond in het volgende fragment.
'onDemoEvent',); openbare functie onDemoEvent (DemoEvent $ -gebeurtenis) // haal gebeurtenisinformatie hier op echo "DemoListener is genaamd! \ n"; echo "De waarde van de foo is:". $ event-> getFoo (). "\ n";
Sinds de les DemoSubscriber
implementeert de EventSubscriberInterface
interface, moet het de getSubscribedEvents
methode. De getSubscribedEvents
methode moet een reeks gebeurtenissen retourneren waarop u zich wilt abonneren. U moet de naam van de gebeurtenis opgeven in een matrixsleutel en de naam van de methode in een arraywaarde die wordt aangeroepen wanneer de gebeurtenis wordt geactiveerd.
Het laatste is om de listenermethode in dezelfde klasse te implementeren. In ons geval moeten we de onDemoEvent
methode, en dat hebben we al gedaan.
Het is tijd om onze abonnee te testen! Laten we snel de subscriber_example.php bestand met de volgende inhoud.
addSubscriber ($ abonnee); // verzending $ dispatcher-> verzending (DemoEvent :: NAME, nieuwe DemoEvent ());
U moet de gebruiken addSubscriber
methode van de EventDispatcher
klasse om je eigen abonnee te abonneren, en de EventDispatcher
klas behandelt de rest. Het haalt gebeurtenissen op waarop moet worden geabonneerd getSubscribedEvents
methode en stelt luisteraars in voor die evenementen. Afgezien daarvan is alles hetzelfde en zou het moeten werken zoals verwacht zonder verrassingen.
Laten we het testen!
$ php subscriber_example.php DemoListener is genaamd! De waarde van de foo is: bar
En dat was een evenementabonnee tot uw beschikking! Dat brengt ons ook aan het einde van dit artikel.
Vandaag hebben we de Symfony-gebeurtenis dispatchercomponent onderzocht, waarmee je evenementen en luisteraars in je PHP-applicaties kunt instellen. Door deze bibliotheek te gebruiken, kunt u een losjes gekoppeld systeem maken waarmee componenten van uw toepassing moeiteloos met elkaar kunnen communiceren.
Voel je vrij om je gedachten en vragen te delen via het onderstaande formulier!