繁体   English   中英

如何在ZF2中将doctrine存储库注入服务

[英]How to inject doctrine repository to service in ZF2

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

我的帖子库包含DQL和findAll()find($id)等方法...

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

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

有人可以提供一个如何做到这一点的例子吗?

我正在使用Zend Framework 2和DoctrineORMModule。

最好的办法是写一个自定义PostServiceFactory注入PostRepositoryPostService通过构造函数注入。

例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM