Symfony - 在服务中注入doctrine存储库

Bru*_*pha 9 php symfony doctrine-orm symfony-3.4

根据如何将存储库注入Symfony2中的服务? 就像是

acme.custom_repository:
    class: Doctrine\ORM\EntityRepository
    factory: ['@doctrine.orm.entity_manager', getRepository]
    arguments:
        - 'Acme\FileBundle\Model\File'
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外

无效的服务"acme.custom_repository":类"EntityManager5aa02de170f88_546a8d27f194334ee012bfe64f629947b07e4919__CG __\Doctrine\ORM\EntityManager"不存在.

我怎么能在Symfony 3.4中做到这一点?

更新:

EntityClass实际上是一个有效的类FQCN(也可以在phpstorm上使用复制引用),只是重命名它,因为公司名称在其中:).无论如何更新它.

BlueM的解决方案非常有效.如果你没有使用自动装配这里是服务定义:

Acme\AcmeBundle\Respository\MyEntityRepository:
    arguments:
        - '@Doctrine\Common\Persistence\ManagerRegistry'
        - Acme\AcmeBundle\Model\MyEntity # '%my_entity_class_parameter%'
Run Code Online (Sandbox Code Playgroud)

Blu*_*ueM 20

在使用Symfony 3.4时,您可以使用更简单的方法ServiceEntityRepository.只需实现您的存储库,让它extend上课ServiceEntityRepository,您只需注入它.(至少在使用自动装配时 - 我没有使用经典DI配置,但会认为它也应该有用.)

换一种说法:

namespace App\Repository;

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;

class ExampleRepository extends ServiceEntityRepository
{
    /**
     * @param ManagerRegistry $managerRegistry
     */
    public function __construct(ManagerRegistry $managerRegistry)
    {
        parent::__construct($managerRegistry, YourEntity::class);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在没有任何DI配置的情况下,您可以在任何地方注入存储库,包括控制器方法.

一个警告(同样适用于您尝试注入存储库的方式):如果重置了Doctrine连接,您将引用过时的存储库.但恕我直言,这是我接受的风险,否则我将无法直接注入存储库..

  • 如果您碰巧使用多个实体管理器,您也需要小心一点。如果同一个实体类属于多个管理器,则您无法预测最终将使用哪个管理器。 (3认同)

etu*_*dor 6

正确创建自定义存储库

首先,您需要创建存储库自定义类,该类从学说扩展默认存储库:

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
   // your own methods
}
Run Code Online (Sandbox Code Playgroud)

那么在实体类中就需要这个注解:

/**
 * @ORM\Entity(repositoryClass="MyDomain\Model\UserRepository")
 */
Run Code Online (Sandbox Code Playgroud)

然后在 .yml 文件中定义存储库:

custom_repository:
        class: MyDomain\Model\UserRepository
        factory: ["@doctrine", getRepository]
        arguments:
          - Acme\FileBundle\Model\File
Run Code Online (Sandbox Code Playgroud)

确保存储库的定义中class指向您的自定义存储库类而不是Doctrine\ORM\EntityRepository.

将自定义服务注入您的自定义存储库:

在您的自定义存储库上为您的服务创建自定义设置器

使用 Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
    protected $paginator;

    public function setPaginator(PaginatorInterface $paginator)
    {
        $this->paginator = $paginator;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样注入它们:

custom_repository:
        class: MyDomain\Model\UserRepository

        factory: ["@doctrine", getRepository]
        arguments:
          - Acme\FileBundle\Model\File
        calls:
          - [setPaginator, ['@knp_paginator']]
Run Code Online (Sandbox Code Playgroud)

将您的存储库注入到服务中:

my_custom_service:
    class: Acme\FileBundle\Services\CustomService
    arguments:
        - "@custom_repository"
Run Code Online (Sandbox Code Playgroud)