我正在尝试让Zend \ ServiceManager使用Zend \ Di来创建我的实例,因为我已经预先扫描并缓存了DI定义。我意识到这可能会带来速度损失,但另一方面,我需要编写更少的元代码。
ServiceManager还提供与Zend \ Di的可选绑定,允许Di 作为经理的初始化者或抽象工厂。
但我没有找到任何关于如何使ServiceManager使用Zend \ Di的示例。我甚至不确定我应该在哪里设置它,也许在Module :: getServiceConfig()中?任何人都可以提供一些示例代码吗?
答案 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()