ZF2服务定位器和依赖注入

Agi*_*Die 9 phpunit dependency-injection service-locator zend-framework2

Zend的优秀人员以及一些博主推荐ZF2的新服务定位器/管理器,而不是内置的依赖注入系统.

我的问题是,将模拟对象注入服务是否可行/方便?我在模块的PHPUnit引导程序中看到了一些略显笨拙的尝试.但有没有一种方法可以使用这种服务系统,比如ZF1 + Yadif干净方便?

Ocr*_*ius 13

是的,您可以将模拟对象注入服务.对于单元测试,服务定位器甚至没有发挥作用:

$service = new MyService($mockDependency);
Run Code Online (Sandbox Code Playgroud)

如果您正在编写复杂的集成测试,您需要使用服务定位器配置依赖项和模拟的图形,您可以设置类似我在模块中执行的操作:

$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');
Run Code Online (Sandbox Code Playgroud)

你可以找到的例子ServiceManagerFactoryDoctrineORMModule,在https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php

这可以假设service_that_uses_a_connection由注入其中的工厂实例化connection_service_name.

Zend\Di如果您愿意,您仍然可以使用,但在这种情况下并不是真的需要.

  • @AgileTillIDie请自己做贡献!https://github.com/zendframework/zf2-documentation - 如果你没有GIT-fu,你仍然可以在Github UI中在线编辑它. (3认同)