如何在ZF2中将doctrine资源库注入服务

时间:2015-10-28 00:37:52

标签: php doctrine-orm zend-framework2

我需要在我的邮政服务中注入我的帖子库。我有一个PostControllerPostEntityPostServiceInterfacePostRepository

我的帖子资源库包含DQL,其中包含findAll()find($id)等方法......

在我的PostServiceInterface我有一些方法,例如findfindAll

现在我想访问存储库以获取我的服务的结果。我不想直接在服务中编写查询。我尝试使用DI将服务注入__construct,但这不起作用。

有人可以举例说明如何做到这一点吗?

我正在使用Zend Framework 2和DoctrineORMModule。

1 个答案:

答案 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将自动注入返回的服务实例。