我是ZendFramework 2和整个DI想法的新手。
这是我需要实现的目标:
为了更好地解释3.让我们看看这个例子:
class Ancestor extends Parent { }
在控制器中,或理想情况下在任何地方:
$ancestor = new Ancestor();
$ancestor->doStuffWithEntityManager();
Uppon初始化祖先它必须已经知道注入的资源。
这甚至可能吗?如果不使用它的默认形式我可以通过一些服务管理器等初始化祖先,只要我不需要指定每个祖先。我需要告诉zend:将这个和那个注入到扩展/实现X的每个类中。
有什么想法吗?
P.S。:正如我所说我是新手,所以请指定我必须添加每个示例代码的配置/类文件。
答案 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');