如何在ZF2中的Zend \ ServiceManager中使用Zend \ Di?

时间:2012-11-22 11:18:49

标签: php dependency-injection zend-framework2

我正在尝试让Zend \ ServiceManager使用Zend \ Di来创建我的实例,因为我已经预先扫描并缓存了DI定义。我意识到这可能会带来速度损失,但另一方面,我需要编写更少的元代码。

ServiceManager documentation

  

ServiceManager还提供与Zend \ Di的可选绑定,允许Di   作为经理的初始化者或抽象工厂。

但我没有找到任何关于如何使ServiceManager使用Zend \ Di的示例。我甚至不确定我应该在哪里设置它,也许在Module :: getServiceConfig()中?任何人都可以提供一些示例代码吗?

2 个答案:

答案 0 :(得分:1)

以下适用于我。为了使Zend \ Di与Zend \ ServiceManager兼容,我从Zend \ Di \ Di扩展了一个类MyLib \ Di \ Di,它实现了AbstractFactoryInterface。

namespace MyLib\Di;
use Zend\ServiceManager\AbstractFactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface;

class Di extends \Zend\Di\Di implements AbstractFactoryInterface
{
    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        return true;
    }

    public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        return $this->get($requestedName);
    }
}

现在,我可以使用MyLib \ Di \ Di作为Zend \ ServiceManager的后备抽象工厂。这是我如何创建IndexController的示例。 IndexController的依赖项(构造函数参数)会自动注入。

class Module
{
    ... 

    public function getServiceConfig()
    {        
        $this->di = new \MyLib\Di\Di;
        $this->configureDi($this->di); // Set up definitions and shared instances

        return array(
            'abstract_factories' => array($this->di),
        );
    }

    public function getControllerConfig()
    {
        return array(
            'factories' => array(
                'Survey\Controller\IndexController' => function() {
                    return $this->di->get('Survey\Controller\IndexController');
                },
            ),
        );
    }
}

答案 1 :(得分:-1)

一个选项 - 添加到config / module.config.php

'service_manager' => array(
    'invokables' => array(
        'Application\Service\User'              => 'Application\Service\User',
    ),
  ),

然后类需要实现Zend \ ServiceManager \ ServiceManagerAwareInterface

启动时,将注入serviceManager实例,然后您可以在类中使用类似的内容:

$authService = $this->getServiceManager()->get('Zend\Authentication\AuthenticationService');

第二个选项是将它放入Module.php

public function getServiceConfig()