我是 ZendFramework 2 和整个 DI 理念的新手。
这是我需要实现的目标:
- 创建许多扩展单个 AbstractModel 的模型类
- 使用带有依赖项的 DI 提供 AbstractModel(在我的例子中是学说实体管理器)
- 在我需要的地方使用祖先类作为普通类
为了更好地解释 3. 让我们看一下这个例子:
class Ancestor extends Parent { }
在 Controller 中,或者理想情况下在任何地方:
$ancestor = new Ancestor();
$ancestor->doStuffWithEntityManager();
在初始化祖先时,它必须已经知道注入(inject)的资源。
这可能吗?如果不使用它的默认形式,我可以通过一些服务管理器等初始化祖先,只要我不需要指定每个祖先。我需要告诉 zend:将这个和那个注入(inject)到扩展/实现 X 的每个类中。
有什么想法吗?
P.S.:正如我所说,我是个新手,所以请指定我必须添加每段示例代码的配置/类文件。
最佳答案
在我的架构中,我按照以下方式进行操作。首先:我创建一个服务:
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 类甚至可以具有莫德依赖关系,在我的例子中,由于它们实现的接口(interface),这些依赖关系会自动注入(inject)。你可以看一个例子right here 。然后,特定的 EntityService 只需要一个定义存储库的函数,例如 this example here .
建议您阅读Rob Allens introduction to ServiceManager Configuration Keys 。特别阅读“初始化程序”部分,我想这是您主要关心的问题?
我希望这能解决您的问题。
关于php - ZF2 : Dependency injection done the proper way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13412698/