tipos inyeccion injection explicacion ejemplo dependency dependencias dependencia control dependency-injection phpunit zend-framework2 service-locator

dependency injection - inyeccion - Localizador de servicios ZF2 e inyección de dependencia



inyeccion de dependencias spring (1)

Las buenas personas de Zend, y varios bloggers, están recomendando el nuevo localizador / administrador de servicios para ZF2, en lugar de su sistema de inyección de dependencias incorporado.

Mi pregunta es, ¿es posible / conveniente inyectar objetos simulados en un servicio? He visto algunos intentos ligeramente torpes de hacer esto en el arranque de PHPUnit de un módulo; pero, ¿hay alguna forma de utilizar este sistema de servicio que sea tan limpio y conveniente como, por ejemplo, ZF1 + Yadif?


Sí, puedes inyectar objetos simulados en un servicio. Para una prueba unitaria, el localizador de servicios ni siquiera entra en juego:

$service = new MyService($mockDependency);

Si está escribiendo pruebas de integración complejas donde necesita usar el Localizador de servicios para configurar un gráfico de dependencias y burlas, puede configurar algo así como lo que estoy haciendo con mis módulos:

$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'');

Puede encontrar un ejemplo de ServiceManagerFactory en DoctrineORMModule en https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php

Esto funciona suponiendo que service_that_uses_a_connection es instanciado por una fábrica que inyecta connection_service_name en él.

También puede usar Zend/Di si lo prefiere, pero en realidad no es necesario en tales casos.