ZF2:以正确的方式完成依赖注入

时间:2012-11-16 08:12:05

标签: php class zend-framework dependency-injection zend-framework2

我是ZendFramework 2和整个DI想法的新手。

这是我需要实现的目标:

  1. 创建许多扩展单个AbstractModel
  2. 的Model类
  3. 使用带有依赖关系的DI(在我的情况下是doctrine实体管理器)提供AbstractModel
  4. 在我需要的地方使用祖先类作为普通类
  5. 为了更好地解释3.让我们看看这个例子:

    class Ancestor extends Parent { }
    

    在控制器中,或理想情况下在任何地方:

    $ancestor = new Ancestor();
    $ancestor->doStuffWithEntityManager();
    

    Uppon初始化祖先它必须已经知道注入的资源。

    这甚至可能吗?如果不使用它的默认形式我可以通过一些服务管理器等初始化祖先,只要我不需要指定每个祖先。我需要告诉zend:将这个和那个注入到扩展/实现X的每个类中。

    有什么想法吗?

    P.S。:正如我所说我是新手,所以请指定我必须添加每个示例代码的配置/类文件。

3 个答案:

答案 0 :(得分:6)

在我的架构中,我会像下面这样做。第一:我创建了一个服务:

class Module 
{
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'my-service-name'   => 'MyNamespace\Factory\MyServiceFactory'
            )
        );
    }
}

然后我创建ServiceFactory。这将是所有依赖关系将被处理的点。

<?php
namespace MyNamespace\Factory;

use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
use MyNamespace\Service\SomeService;

class MyServiceFactory implements FactoryInterface
{
    /**
     * Create service
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return \MyNamespace\Service\SomeService
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $service = new SomeService();
        $service->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'));
        return $service;
    }
}

MyService-Class甚至可以具有morde依赖性,在我的情况下由于它们实现的接口而自动注入。您可以看到示例right here。然后,特定的EntityService只需要一个定义存储库的函数,如this example here

您可能还会被建议阅读Rob Allens introduction to ServiceManager Configuration Keys。具体阅读“初始化者”部分,我想这是你的主要关注问题?

我希望这能涵盖你的问题。

答案 1 :(得分:1)

您可以注入实体管理器创建自定义存储库类并将其注入覆盖find *方法调用

Using EntityManager inside Doctrine 2.0 entities

但是我建议您检查一下您的设计,因为这不是对实体数据库的正常调用

答案 2 :(得分:-1)

class Parent {
    private $em;

    public function __construct(\Doctrine\ORM\EntityManager $em) {
        $this->em = $em;
    }
}

class Ancestor extends Parent { }

// To use, create an EntityManager $em

$ancestor = new Ancestor($em);
$ancestor->doStuffWithEntityManager(); // Uses $this->em internally

这就是依赖注入的全部内容。另请参阅http://fabien.potencier.org/article/11/what-is-dependency-injection

点击此处查看在ZF2中获取/创建EntityManager:http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/

基本上,在从AbstractActionController扩展的控制器中,你可以这样做:

$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');