2013-09-08 16 views
15

Sto imparando zf2, leggendo documenti, tutorial ecc. Dal web. Ora sono confuso riguardo a Zend\ServiceManager\ServiceManagerAwareInterface.php e Zend\ServiceManager\ServiceLocatorAwareInterface.php.zf2 ServiceManager vs ServiceLocator

anche in qualche luogo (come controllore) che uso $this->getServiceLocator() per andare a prendere l'oggetto ServiceManager, mentre in altri posti usiamo ->getServiceManager() e restituisce anche la stessa ServiceManager oggetto.

+0

@ Sam, Perché abbiamo bisogno di entrambi i metodi, allora? – haim770

+0

Ma perché ci sono due interfacce. 'Zend \ ServiceManager \ ServiceManagerAwareInterface.php' e' Zend \ ServiceManager \ ServiceLocatorAwareInterface.php'. Se SM è l'implementazione di SL, perché abbiamo un'interfaccia separata. –

risposta

16

Il localizzatore è l'interfaccia. Il design di Zend Framework 2 viene eseguito con "design by contract", il che significa che ti affidi alle interfacce piuttosto che alle classi. Manager è un'implementazione predefinita del localizzatore.

Tutti tranne un componente utilizzano il localizzatore. Tuttavia, il gestore fornisce più funzionalità di quelle che dice l'interfaccia. Il Zend\Mvc\Application utilizza queste funzioni e pertanto si affida al Manager anziché al localizzatore.

La decisione di utilizzare il localizzatore negli inizializzatori * Aware è stata presa troppo tardi per il rilascio, quindi questo è il motivo per cui vi è sia un ServiceLocatorAwareInterface sia un ServiceManagerAwareInterface. C'era già il codice userland che utilizzava l'inizializzatore di Manager, quindi è mantenuto per la compatibilità all'indietro. Internamente tutti i componenti utilizzano l'inizializzatore Locator. Se devi scegliere, scegli il Locator e lascia il Manager il più possibile a parte.

un po 'di tempo fa ho anche bloggato sul localizzatore e il Gestore: https://juriansluiman.nl/article/120/using-zend-framework-service-managers-in-your-application

5

Il ServiceManager è fondamentalmente l'implementazione dell'interfaccia ServiceLocator. La ragione di avere due è che un utente può avere la propria implementazione dell'interfaccia ServiceLocator. Quando si richiede il ->getServiceManager(), si ottiene l'implementazione esplicita ServiceManager. Utilizzando ->getServiceLocator() si richiede l'implementazione dell'interfaccia ServiceLocator che può essere l'implementazione da parte di ServiceManager o la propria. Ma come la maggior parte delle volte c'è solo l'implacuazione ServiceManager predefinita in modo da ottenere lo stesso oggetto.

+0

che ha senso, ma ancora una volta perché abbiamo "Zend \ ServiceManager \ ServiceManagerAwareInterface.php". e quale approccio pensi che dovrebbe essere usato. –

+2

mi blocco con 'ServiceLocator' perché ha anche un tratto disponibile, quindi uso solo il tratto e non devo implementare SL/SM da solo più volte. – Bryan