Non usarli
... senza restrizioni. Ma usali quando il loro uso è ristretto a uno specifico ruolo ben mantenuto, in quanto ciò facilita la manutenzione del software ed evita il nascondimento delle dipendenze.
In primo luogo, alcuni sfondi.
Nel contesto dell'architettura di Zend Framework 2+, l'iniezione di qualsiasi DiC in un controller significa utilizzare quel DiC come localizzatore di servizi. (In Zend Framework, l'implementazione concreta di Service Locator si chiama ServiceManager ).
Per l'uso puro di DiC come DiC esiste un modello Register Resolve Release (RRR), che crea il controller per te e lo popola con dipendenze. Di norma, non si inserisce DiC nel controller, anche se lo si potrebbe fare, quindi si mischiano i modelli DiC e Service Locator.
Questo link è utile per fornire maggiori dettagli sulle differenze: link
Consigli della community
Inoltre, ci sono stati alcuni consigli su evitare l'uso di DiC , perché del più lento PHP Reflection API e vari problemi di manutenzione lungo la strada. DiC semplifica l'utilizzo di dipendenze complesse con conseguente creazione di grafici di dipendenza complessi che vengono creati automaticamente senza il cablaggio esplicito del codice manuale. Ciò rende difficile eseguirne il debug quando le cose vanno male. Se si aggiungono nuove dipendenze nel tempo, il ricablaggio automatico viene eseguito automaticamente senza scrivere codice di cablaggio esplicito. Ciò rende potenzialmente più difficile tenere traccia delle dipendenze manualmente quando qualcosa va storto. Si consiglia quindi di utilizzare il modello di localizzazione del servizio in quanto limita il valore di fabbrica a Di, offrendo un controllo più esplicito di Di tramite la configurazione esplicita.
Per RAD, quando i Controllori richiedono molte dipendenze, quando la logica aziendale è abbastanza complessa, invece di ingombrare i metodi del costruttore di Controller con più di 5 dipendenze, è a volte più conveniente passare il Service Locator / container come dipendenza a il Controller e il codice all'interno del Controller invocano vari oggetti tramite le strutture SL / DiC.
Per i non-RAD, suddividi i tuoi controller in punti in cui non hanno molte dipendenze.
Inoltre:
"Besides ZF2 controllers, I recommend not to inject ZendDiCompiler
directly anywhere. If you need a service in one of your classes, just
ask for it in the constructor"
From: dependency-injection-container-vs-service-locator
Tuttavia, non consiglio di iniettare DiC nei controller. Leggi qui sotto perché.
Utilizzo dell'indicatore di servizio
Non utilizzare Service Locator senza restrizioni. È stato ritirato in Zend per buoni motivi .
Utilizza la versione limitata di Service Locator come ad esempio come viene utilizzato in Zend Framework versione 3. È limitato a essere un Localizzatore di servizio con configurazione hardcoded basato su factory implementato tramite ServiceManager
class. Collega il routing ai controllori tramite l'istanziazione dei controllori direttamente, o delle fabbriche (dove i controllori ricevono le loro dipendenze), Invokables, AbstractFactories. Ulteriori informazioni su ServiceManager qui
Utilizzo dell'invio della dipendenza / Inversione dei contenitori di controllo
È possibile utilizzare DiC per semplificare la gestione delle dipendenze per lo sviluppo di applicazioni rapide (RAD), ma aspettarsi ulteriori problemi di debug e di manutenzione lungo la strada se non si decide successivamente di iniettare direttamente le proprie dipendenze. Per evitare dolori maggiori, se hai intenzione di utilizzare DiC, usa il pattern RRR per creare i tuoi Controllers e popolarli con qualsiasi dipendenza.
Interfaccia contenitore PSR-11
Vedi link