【问题标题】:ZF2 service locator & dependency injectionZF2 服务定位器和依赖注入
【发布时间】:2013-01-21 22:12:34
【问题描述】:

Zend 的优秀人员和许多博主都在推荐 ZF2 的新服务定位器/管理器,而不是其内置的依赖注入系统。

我的问题是,将模拟对象注入服务是否可能/方便?我在模块的 PHPUnit 引导程序中看到了一些稍微笨拙的尝试;但是有没有像ZF1 + Yadif这样干净方便的服务系统使用方法呢?

【问题讨论】:

    标签: dependency-injection phpunit zend-framework2 service-locator


    【解决方案1】:

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

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

    您可以在DoctrineORMModulehttps://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php 中找到ServiceManagerFactory 的示例

    假设service_that_uses_a_connection 是由将connection_service_name 注入其中的工厂实例化的。

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

    【讨论】:

    • 感谢您的帮助!希望有一天 Zend 文档会这么清晰!
    • @AgileTillIDie 请您贡献自己的力量! github.com/zendframework/zf2-documentation - 如果你没有 GIT-fu,你仍然可以在 Github UI 中在线编辑它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多