ZF2服务定位器和依赖注入

9

Zend的专业人士和许多博客作者都推荐ZF2中的新服务定位器/管理器,而不是其内置依赖注入系统。

我的问题是,是否可以/方便地将模拟对象注入到服务中?我已经看到一些在模块的PHPUnit引导程序中做这个操作的略显笨拙的尝试;但是否有一种使用此服务系统的方式,像ZF1 + Yadif那样干净、方便呢?

1个回答

13

是的,你可以将模拟对象注入到服务中。在单元测试中,服务定位器甚至都不会发挥作用:

$service = new MyService($mockDependency);

如果您正在编写需要使用服务定位器配置依赖关系图和模拟对象的复杂集成测试,您可以设置类似于我使用我的模块的内容:

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

您可以在https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php找到一个ServiceManagerFactory的例子,它在DoctrineORMModule中。

假设service_that_uses_a_connection由注入connection_service_name的工厂实例化,则此方法适用。

如果您喜欢,仍然可以使用Zend\Di,但在这种情况下并不是真正必需的。


1
感谢您的帮助!希望有一天Zend文档也能这么清晰易懂! - AgileTillIDie
3
@AgileTillIDie 请务必贡献自己的力量!https://github.com/zendframework/zf2-documentation - 如果您不懂GIT-fu,您仍然可以在Github UI上在线编辑。 - Ocramius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接