Oggi impareremo come utilizzare il componente dispatcher dell'evento Symfony, che ti consente di creare eventi e ascoltatori nelle tue applicazioni PHP. Pertanto, diversi componenti della tua applicazione possono comunicare tra loro con codice liberamente accoppiato.
Si può avere familiarità con il pattern event-observer, che consente di definire i listener per gli eventi generati dal sistema in modo che vengano eseguiti quando l'evento viene attivato. Allo stesso modo, il componente EventDispatcher di Symfony consente di configurare un sistema in cui è possibile creare eventi e ascoltatori personalizzati. In questo modo, permetti ai componenti della tua applicazione di reagire se qualcosa succede in un sistema.
In effetti, il componente dispatcher di eventi fornisce tre elementi che puoi creare attorno all'architettura dell'app:evento, listener e dispatcher. L'intero sistema è orchestrato dalla classe dispatcher, che solleva gli eventi nei punti appropriati di un'applicazione e chiama gli ascoltatori associati a tali eventi.
Supponiamo che tu voglia consentire ad altri componenti della tua applicazione di reagire quando la cache viene cancellata. In tal caso, è necessario definire l'evento di cancellazione della cache in primo luogo. Dopo aver svuotato la cache, è possibile utilizzare il dispatcher per aumentare l'evento di cancellazione della cache e informare tutti gli ascoltatori che ascoltano questo evento. Ciò offre agli ascoltatori l'opportunità di eliminare le cache specifiche dei componenti.
In questo articolo, esploreremo le basi del componente del dispatcher dell'evento. Inizieremo con l'installazione e la configurazione e creeremo anche alcuni esempi reali per dimostrare tutti i concetti sopra menzionati.
In questa sezione, installeremo il componente del dispatcher dell'evento. Presumo che tu abbia già installato Composer sul tuo sistema, perché ne avremo bisogno per installare il componente EventDispatcher.
Una volta installato Composer, andare avanti e installare il componente EventDispatcher usando il seguente comando.
$ compositore richiede symfony / event-dispatcher
Questo dovrebbe aver creato il composer.json file, che dovrebbe assomigliare a questo:
"require": "symfony / event-dispatcher": "^ 4.1"
Modifichiamo ulteriormente il composer.json file per apparire come il seguente:
"require": "symfony / event-dispatcher": "^ 4.1", "autoload": "psr-4": "EventDispatchers \\": "src", "classmap": ["src "]
Una volta aggiunta una nuova voce di classe, procedere e aggiornare il caricatore automatico Composer eseguendo il seguente comando.
$ compositore discarica -o
Ora puoi usare il EventDispatchers
spazio dei nomi per le classi di autoload sotto il src elenco.
Quindi questa è la parte di installazione, ma come si dovrebbe utilizzarla? In realtà, è solo questione di includere il autoload.php file creato da Composer nella tua applicazione, come mostrato nello snippet seguente.
In questa sezione, vedremo un esempio che dimostra come è possibile creare un evento personalizzato e impostare un listener per quell'evento.
Per cominciare, vai avanti e crea il src / Eventi / DemoEvent.php file con il seguente contenuto.
foo = 'bar'; public function getFoo () return $ this-> foo;
La nostra abitudine DemoEvent
la classe estende il nucleo Evento
classe del componente EventDispatcher. Il NOME
costante mantiene il nome del nostro evento personalizzato-demo.event
. Viene utilizzato quando si desidera impostare un listener per questo evento.
Quindi, creiamo la classe listener src / ascoltatori / DemoListener.php con i seguenti contenuti.
getFoo () "\ n".;
Il DemoListener
la classe implementa il onDemoEvent
metodo che viene attivato quando il sistema invia il DemoEvent
evento. Ovviamente, non succederà ancora automaticamente, poiché è necessario registrare il DemoListener
ascoltatore per ascoltare il demo.event
evento che utilizza la classe EventDispatcher.
Finora, abbiamo creato classi di eventi e ascoltatori. Quindi vedremo come unire tutti questi pezzi insieme.
Creiamo il basic_example.php file con il seguente contenuto.
addListener ('demo.event', array ($ listener, 'onDemoEvent')); // invia $ dispatcher-> dispatch (DemoEvent :: NAME, new DemoEvent ());
Il EventDispatcher
la classe è l'elemento più importante nel componente EventDispatcher: consente di associare gli ascoltatori agli eventi che desiderano ascoltare. Abbiamo usato il addListener
metodo del EventDispatcher
classe per ascoltare il demo.event
evento.
Il primo argomento del addListener
metodo è un nome evento e il secondo argomento è PHP callable che viene attivato quando viene inviato l'evento registrato. Nel nostro caso, abbiamo fornito il DemoListener
oggetto come ascoltatore insieme al onDemoEvent
metodo.
$ dispatcher-> addListener ('demo.event', array ($ listener, 'onDemoEvent'));
Finalmente, abbiamo usato il spedizione
metodo del EventDispatcher
classe per spedire il demo.event
evento.
$ dispatcher-> dispatch (DemoEvent :: NAME, new DemoEvent ());
Quando esegui il basic_example.php file, dovrebbe produrre il seguente output.
$ php basic_example.php Viene chiamato DemoListener! Il valore di foo è: bar
Come previsto, il onDemoEvent
metodo del DemoListener
la classe è chiamata, e questo a sua volta chiama il getFoo
metodo del DemoEvent
classe per recuperare le informazioni relative agli eventi.
Nella sezione precedente, abbiamo creato un esempio che dimostra come creare un evento personalizzato e un listener personalizzato. Abbiamo anche discusso su come associare un listener all'evento specifico usando il EventDispatcher
classe.
Questo è stato un semplice esempio, poiché volevamo solo impostare un listener per un singolo evento. D'altra parte, se si desidera impostare listener per più eventi o se si desidera raggruppare logicamente la logica di gestione degli eventi in una singola classe, è necessario considerare l'utilizzo di sottoscrittori di eventi perché consentono di mantenere tutto in un unico punto.
In questa sezione, rivedremo l'esempio che è stato creato nella sezione precedente.
La prima cosa che dobbiamo fare è creare una classe subscriber che implementa il EventSubscriberInterface
interfaccia. Vai avanti e crea il src / Subsribers / DemoSubscriber.php classe come mostrato nel seguente frammento.
'onDemoEvent',); public function onDemoEvent (DemoEvent $ event) // recupera informazioni sull'evento qui echo "DemoListener è chiamato! \ n"; echo "Il valore di foo è:". $ event-> getFoo (). "\ n";
Dal momento che la classe DemoSubscriber
implementa il EventSubscriberInterface
interfaccia, deve implementare il getSubscribedEvents
metodo. Il getSubscribedEvents
il metodo dovrebbe restituire una serie di eventi a cui si desidera iscriversi. È necessario fornire il nome dell'evento in una chiave di array e il nome del metodo in un valore di matrice che viene chiamato quando viene attivato l'evento.
L'ultima cosa è implementare il metodo listener nella stessa classe. Nel nostro caso, dobbiamo implementare il onDemoEvent
metodo, e lo abbiamo già fatto.
È tempo di testare il nostro abbonato! Creiamo rapidamente il subscriber_example.php file con il seguente contenuto.
addSubscriber ($ abbonato); // invia $ dispatcher-> dispatch (DemoEvent :: NAME, new DemoEvent ());
Devi usare il addSubscriber
metodo del EventDispatcher
classe per sottoscrivere il tuo abbonato personalizzato, e il EventDispatcher
classe gestisce il resto. Raccoglie gli eventi per essere sottoscritto dal getSubscribedEvents
metodo e imposta gli ascoltatori per quegli eventi. A parte questo, tutto è lo stesso, e dovrebbe funzionare come previsto senza sorprese.
Proviamoci!
$ php subscriber_example.php DemoListener è chiamato! Il valore di foo è: bar
E quello era un abbonato dell'evento a tua disposizione! Questo ci porta anche alla fine di questo articolo.
Oggi abbiamo esplorato il componente dispatcher dell'evento Symfony, che ti consente di configurare eventi e ascoltatori nelle tue applicazioni PHP. Utilizzando questa libreria, è possibile creare un sistema liberamente accoppiato che consente ai componenti dell'applicazione di comunicare tra loro senza sforzo.
Sentiti libero di condividere i tuoi pensieri e le tue domande utilizzando il modulo sottostante!