我正试图让zend\servicemanager使用zend\di创建我的实例,因为我已经预先扫描并缓存了di定义。我意识到这可能会带来速度损失,但另一方面,我需要写更少的元代码。
ServiceManager documentation说
servicemanager还提供到zend\di的可选绑定,允许di
充当经理的初始值设定项或抽象工厂。
但我找不到任何关于如何使servicemanager使用zend\di的示例。我甚至不确定应该在哪里设置,可能是在module::getserviceconfig()中?有人能提供一些示例代码吗?
最佳答案
以下对我有用。为了使zend\di与zend\servicemanager兼容,我从zend\di\di扩展了一个类mylib\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');
},
),
);
}
}