V-ati saturat sa adaugati CompilerPasses doar pentru a colecta cateva servicii etichetate pe container?

Spuneti NU celor mai multi dintre ei cu acest pachet!

⚠ Nota ⚠

Atentie la schimbarea spatiului de nume

  • Inainte de 0.4.0: Berny \ Bundle \ TagBundle
  • Dupa 0.4.0: xPheRe \ Bundle \ TagBundle

De ce as vrea asta?

De mai multe ori doriti sa cautati servicii etichetate cu o anumita eticheta si sa apelati o metoda din serviciul dvs. cu acestea. Acest lucru se poate face cu un CompilerPass personalizat.

services: my_plugin_enumerator: class: PluginEnumerator useless_plugin: class: UselessPlugin tag: – {name: my_plugin} even_more_useless_plugin: class: EvenMoreUselessPlugin tag: – {nume: my_plugin}
clasa PluginEnumeratorConsumerCompilerPass implementeaza CompilerPassInterface {procesul functiei publice (ContainerBuilder $ container) {if (! $ container-> has (‘my_plugin_enumerator’)) {return; } $ definition = $ container-> findDefinition (‘enumeratorul_pluginul meu’); $ taggedServices = $ container-> findTaggedServices (‘my_plugin’); foreach ($ taggedServices as $ id => $ atribute) {$ definitie-> addMethodCall (‘addPlugin’, matrice (referinta noua ($ id))); }}}

Un alt caz de utilizare este de a injecta un serviciu fiecaruia care este etichetat cu o anumita eticheta. Un exemplu:

services: my_event_dispatcher: class: MyEventDispatcher useless_service: class: UselessService tag: – {name: my_event_dispatcher.aware} even_more_useless_service: class: EvenMoreUselessService tag: – {nume: my_event_dispatcher.aware}
clasa MyEventDispatcherInjectableCompilerPass implementeaza CompilerPassInterface {procesul functiei publice (ContainerBuilder $ container) {if (! $ container-> has (‘my_event_dispatcher’)) {return; } $ reference = new Reference (‘my_event_dispatcher’); $ taggedServices = $ container-> findTaggedServices (‘my_event_dispatcher.aware’); foreach ($ etichetateServicii ca $ id => $ atribute) {$ definitie = $ container-> findDefinition ($ id); $ definition-> addMethodCall (‘setMyEventDispatcher’, matrice ($ referinta)); }}}

Aceasta boilerplate se repeta o data si din nou in fiecare proiect pe care l-am vazut. Cu acest pachet puteti spune la revedere de la majoritatea acestor treceri de compilator.

Caracteristici

Cu acest pachet puteti:

  • Etichetati un serviciu ca consumator al unei alte etichete.
  • Etichetati un serviciu ca injectabil in altele.

Compatibilitate

Testat sub Symfony2, de la 2.0.10 la 2.6.3

Instalare

De la compozitor / ambalator

  • Solicitati pachetul xphere / tag-bundle in compozitor
  • Adaugati pachetul in AppKernel.php

Utilizare

Consumator

Puteti defini un serviciu ca „consumator de etichete” al altei etichete si lasati pachetul sa faca relatia dintre ele. Doar etichetati-va serviciul ca tag.consumer si specificati ce eticheta sa colectati si ce metoda sa apelati.

Primul exemplu care utilizeaza acest pachet este doar configurarea:

services: my_plugin_enumerator: class: PluginEnumerator tags: – {name: tag.consumer, tag: my_plugin, method: addPlugin} useless_plugin: class: UselessPlugin tag: – {name: my_plugin} even_more_useless_plugin: class: EvenMoreUselessPlugin: }

Singura modificare este eticheta din my_plugin_enumerator. Placa centrala CompilerPass a disparut.

Aceasta apeleaza PluginEnumerator :: addPlugin cu fiecare my_plugin, dar puteti apela o data cu toate serviciile folosind parametrul masiv.

services: my_plugin_enumerator: class: PluginEnumerator tags: – {name: tag.consumer, tag: my_plugin, method: addPlugins, bulk: true}

Acesta apeleaza PluginEnumerator :: addPlugins o singura data, cu o serie de servicii.

Pentru a face serviciul sa isi consume dependentele prin intermediul constructorului sau, trebuie doar sa omiteti atributul metodei din eticheta.

Injectabil

Puteti defini un serviciu ca „eticheta injectabila” dintr-o alta eticheta si lasati pachetul sa faca munca grea.

guarras masturbandose pajas trans
violada xxx pelis porno españolas
megan montaner follando maduras americanas
esposas compartidas incesto madre hijos
videos prono trio por sorpresa
xxx incesto real xxx torrent magnet
madres incestuosas incesto jovencitas
vecinas cachondas abuelas a cuatro patas
monica hoyos porno porno español dinero
pilladas cagando pillados follando
folladas extremas videos heroticos
corridas en la garganta suegras españolas follando
enseñando a follar pilladas cagando
jolla pr viejas muy calientes
mujer masturbandose porno por el culo
violadas xxx travestis meando
pornolesvianas mujeres peludas follando
potno peliculas porno traducidas al castellano
maduras españolas anal peliculas eroticas alemanas
guarras.com videos porno trios español

Doar etichetati serviciul ca eticheta.injectabila si specificati ce eticheta sa colectati si ce metoda sa apelati in fiecare serviciu.

Al doilea exemplu din introducere va fi astfel:

services: my_event_dispatcher: class: MyEventDispatcher tag: – {name: tag.injectable, tag: my_event_dispatcher.aware, method: setMyEventDispatcher} useless_service: class: UselessService tag: – {name: my_event_dispatcher.aware} even_more_esservice: even_more_useless_service: {name: my_event_dispatcher.aware}

Singura modificare este eticheta din my_event_dispatcher. Boilerul CompilerPass a disparut, de asemenea.

Acest lucru forteaza toate my_event_dispatcher.aware sa aiba o metoda setMyEventDispatcher. Dar puteti schimba acest lucru pentru un anumit serviciu cu parametrul metoda.

services: my_event_dispatcher: class: MyEventDispatcher tag: – {name: tag.injectable, tag: my_event_dispatcher.aware, method: setMyEventDispatcher} useless_service: class: UselessService tag: – {name: my_event_dispatcher.aware, method: setEventDispus Eticheta EvenMoreUselessService: – {name: my_event_dispatcher.aware}

Acum apeleaza setEventDispatcher pentru UselessService si metoda implicita pentru celelalte.

Utilizare avansata

Este vorba despre elementele de baza, exista totusi mai multe optiuni disponibile pentru controlul major asupra dependentelor dvs.

Ordin

Puteti specifica ordinea in care serviciile vor fi injectate consumatorului cu campul de comanda din fiecare eticheta. Comenzile mai mici au prioritate fata de comenzile mai mari. Serviciile etichetate fara comanda vor fi injectate dupa cele comandate. In cazul unei legaturi intre ordine, pastreaza ordinea de declaratie symfony.

Indexarea serviciilor in bloc

Cand masa este activa, puteti specifica o cheie care va fi utilizata pentru indexarea fiecarei etichete, in loc de o matrice simpla.

services: my_command_bus: class: MyCommandBus tags: – {name: tag.consumer, tag: my_command_handler, bulk: true, key: handles} my_class_command_handler: class: MyClassCommandHandler tag: – {name: my_command_handler, handles: MyClass} other_class Eticheta OtherClassCommandHandler: – {name: my_command_handler, handles: OtherClass}

Acest lucru duce la urmatoarea injectie:

[‘MyClass’ => new MyClassCommandHandler (), ‘OtherClass’ => new OtherClassCommandHandler (),]

De asemenea, puteti specifica faptul ca mai multe elemente vor intra in coliziune cu acelasi index si trebuie sa colecteze tablouri in loc de servicii unice cu campul multiplu din definitia consumatorului.

services: my_event_bus: class: MyEventBus tags: – {name: tag.consumer, tag: my_event_handler, bulk: true, key: listensTo, multiple: true} first_event_handler: class: FirstEventHandler tag: – {name: my_event_handler, listensTo: MyEvent} second_event_handler: class: SecondEventHandler tag: – {name: my_event_handler, listensTo: OtherEvent} third_event_handler: class: ThirdEventHandler tag: – {name: my_event_handler, listensTo: MyEvent}

Acest lucru duce la urmatoarea injectie:

[‘MyEvent’ => [new FirstEventHandler (), new ThirdEventHandler (),], ‘OtherEvent’ => [new SecondEventHandler (),],]

Multiple, de asemenea, onoreaza comanda, daca se specifica.

Referinta

Ca de obicei, dependentele sunt injectate direct in serviciul dvs., dar va puteti injecta dependentele ca ID-uri de serviciu, setand referinta campului la fals in definitia consumatorului.

Instanta de

Puteti forta dependentele dvs. sa fie o instanta a unei clase sau a unei interfete cu campul instanceof din definitia dvs. de consumator.

Fara pachet

Puteti adauga manual TagConsumerPass sau TagInjectablePass (sau ambele) fara a adauga pachetul „intreg” la Kernel, chiar si personalizati numele etichetelor utilizate pentru a le aplica.

In nucleul dvs.:

[…] utilizati xPheRe \ Bundle \ TagBundle \ DependencyInjection \ Compiler \ TagConsumerPass; utilizati xPheRe \ Bundle \ TagBundle \ DependencyInjection \ Compiler \ TagInjectablePass; […] clasa AppKernel extinde Kernel {[…] functia protejata prepareContainer (container ContainerBuilder $) {parinte :: prepareContainer ($ container); $ container-> addCompilerPass (nou TagConsumerPass (‘tag_collector’)); $ container-> addCompilerPass (nou TagInjectablePass (‘tag_injectable’)); } […]}