我正试图让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');
                },
            ),
        );
    }
}

07-28 02:50
查看更多