9

Le brave persone di Zend e di alcuni blogger raccomandano il nuovo servizio di localizzazione/gestione per ZF2, piuttosto che il suo sistema integrato di iniezione delle dipendenze.ZF2 service locator & dependency injection

La mia domanda è, è possibile/conveniente iniettare oggetti di simulazione in un servizio? Ho visto alcuni tentativi un po 'goffi di farlo nel bootstrap PHPUnit di un modulo; ma c'è un modo di usare questo sistema di servizio che è pulito e conveniente come, per esempio, ZF1 + Yadif?

risposta

12

Sì, è possibile iniettare oggetti fittizi in un servizio. Per un test di unità, il localizzatore di servizio non ha nemmeno entrare in gioco:

$service = new MyService($mockDependency); 

Se si sta scrivendo i test di integrazione complessi in cui è necessario utilizzare il Servizio Locator essere configurato con un grafico delle dipendenze e schernisce, è possibile messa a punto qualcosa di simile a quello che sto facendo con i miei moduli:

$serviceLocator = ServiceManagerFactory::getServiceManager(); // see comment below 
$dbConnectionMock = $this->getMock('My\Db\Connection'); 

$serviceLocator->setAllowOverride(true); 
// replacing connection service with our fake one 
$serviceLocator->setService('connection_service_name', $dbConnectionMock); 

$service = $serviceLocator->get('service_that_uses_a_connection'); 

È possibile trovare un esempio di ServiceManagerFactory in DoctrineORMModule a https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php

questo funziona assumendo che service_that_uses_a_connection è istanziato da una fabbrica che inietta connection_service_name in esso.

Si può ancora usare anche Zend\Di se si preferisce, ma in questi casi non è veramente necessario.

+1

Grazie per il vostro aiuto! Speriamo che un giorno la documentazione di Zend sarà chiara! – AgileTillIDie

+2

@AgileTillIDie, per favore, contribuisci! https://github.com/zendframework/zf2-documentation - se non hai GIT-fu, puoi comunque modificarlo online nell'interfaccia di Github. – Ocramius