我需要在我的邮政服务中注入我的帖子库。我有一个PostController
,PostEntity
,PostServiceInterface
和PostRepository
。
我的帖子资源库包含DQL,其中包含findAll()
,find($id)
等方法......
在我的PostServiceInterface
我有一些方法,例如find
,findAll
。
现在我想访问存储库以获取我的服务的结果。我不想直接在服务中编写查询。我尝试使用DI将服务注入__construct
,但这不起作用。
有人可以举例说明如何做到这一点吗?
我正在使用Zend Framework 2和DoctrineORMModule。
答案 0 :(得分:3)
最好的方法是编写自定义PostServiceFactory
,通过构造函数注入将PostRepository
注入PostService
。
例如:
<?php
namespace Application\Service\Factory;
use Application\Service\PostService;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class PostServiceFactory implements FactoryInterface
{
/**
* Creates and returns post service instance.
*
* @param ServiceLocatorInterface $sm
* @return PostService
*/
public function createService(ServiceLocatorInterface $sm)
{
$repository = $sm->get('doctrine.entitymanager.orm_default')->getRepository('Application\Entity\PostService');
return new PostService($repository);
}
}
您还需要更改PostService
的构造函数签名,如下所示:
<?php
namespace Application\Service;
use Application\Repository\PostRepository;
class PostService
{
protected $repository;
public function __construct(PostRepository $repository)
{
$this->repository = $repository;
}
}
最后,在您的module.config.php
中,您还需要在服务管理器配置中注册您的工厂:
'service_manager' => array(
'factories' => array(
'Application\Service\PostService' => 'Application\Service\Factory\PostServiceFactory',
)
)
现在,您可以通过控制器中的服务定位器获取PostService
,如下所示:
$postService = $this->getServiceLocator()->get('Application\Service\PostService');
我们在工厂编码时,PostRepository
将自动注入返回的服务实例。