Symfony - 注入教义存储库在服务中正确创建自定义存储库将自定义服务注入您的自定义存储库:将存储库注入到服务中:

2022-08-30 20:55:00

根据如何在Symfony2中将存储库注入到服务中?它就像

acme.custom_repository:
    class: Doctrine\ORM\EntityRepository
    factory: ['@doctrine.orm.entity_manager', getRepository]
    arguments:
        - 'Acme\FileBundle\Model\File'

但我得到一个例外

无效的服务“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%'

答案 1

当您使用Symfony 3.4时,您可以使用更简单的方法,使用.只需实现您的存储库,让它上课,您就可以简单地注入它。(至少在使用自动布线时 - 我没有在经典的DI配置中使用它,但会认为它也应该工作。ServiceEntityRepositoryextendServiceEntityRepository

换句话说:

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);
    }
}

现在,无需任何 DI 配置,您就可以将存储库注入到所需的任何位置,包括控制器方法。

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


答案 2

正确创建自定义存储库

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

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
   // your own methods
}

然后,您需要在实体类中使用此注释:

/**
 * @ORM\Entity(repositoryClass="MyDomain\Model\UserRepository")
 */

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

custom_repository:
        class: MyDomain\Model\UserRepository
        factory: ["@doctrine", getRepository]
        arguments:
          - Acme\FileBundle\Model\File

确保在存储库的定义中指向自定义存储库类,而不是 指向 。classDoctrine\ORM\EntityRepository

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

在自定义存储库上,为您的服务创建自定义资源库

使用 Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
    protected $paginator;

    public function setPaginator(PaginatorInterface $paginator)
    {
        $this->paginator = $paginator;
    }
}

然后像这样注入它们:

custom_repository:
        class: MyDomain\Model\UserRepository

        factory: ["@doctrine", getRepository]
        arguments:
          - Acme\FileBundle\Model\File
        calls:
          - [setPaginator, ['@knp_paginator']]

将存储库注入到服务中:

my_custom_service:
    class: Acme\FileBundle\Services\CustomService
    arguments:
        - "@custom_repository"

推荐