如何在symfony 3中为存储库类配置依赖项注入

Dar*_*s.V 7 symfony

Symfony生成器生成以下类库:

namespace AppBundle\Repository;
use AppBundle\Entity\GroupEntity;

/**
 * GroupEntityRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class GroupEntityRepository extends \Doctrine\ORM\EntityRepository
{


}
Run Code Online (Sandbox Code Playgroud)

services.yml:

group_entity_repository:
         class: AppBundle\Repository\GroupEntityRepository
         arguments: ["@doctrine.orm.entity_manager", AppBundle\Entity\GroupEntity]
Run Code Online (Sandbox Code Playgroud)

我错误地配置了services.yml,但我现在不知道如何使用第二个参数.所以我得到错误:

可捕获致命错误:传递给Doctrine\ORM\EntityRepository :: __ construct()的参数2必须是Doctrine\ORM\Mapping\ClassMetadata的实例,给定字符串,在E:\ other\dropbox\Dropbox\programavimas\kodo pavyzdziai \中调用第1626行的htdocs\users_admin_demo\var\cache\dev\appDevDebugProjectContainer.php并定义

怎么解决?我在文档中看不到,它只显示了生成器和最终生成的类的代码,但没有显示服务配置.

Tob*_* Xy 17

从Symfony 3.3开始推荐:

从Symfony 3.3开始,建议使用实际的类名作为服务ID(读取此内容此内容).

AppBundle\Repository\GroupEntityRepository:
    factory: 'Doctrine\ORM\EntityManagerInterface:getRepository'
    arguments:
        - AppBundle\Entity\GroupEntity
Run Code Online (Sandbox Code Playgroud)

原始答案:

您可以像这样配置存储库服务:

group_entity_repository:
    class: AppBundle\Repository\GroupEntityRepository
    factory: ["@doctrine.orm.entity_manager", getRepository]
    arguments:
        - AppBundle\Entity\GroupEntity
Run Code Online (Sandbox Code Playgroud)

您可能永远不想自己调用存储库构造函数.因此,这种方法只使用entity_manager来获取存储库.服务容器基本上使用此代码来获取存储库:

$container->get('doctrine.orm.entity_manager')->getRepository('AppBundle\Entity\GroupEntity');
Run Code Online (Sandbox Code Playgroud)


Fab*_*les 5

从 Symfony 3.4 开始,您可以避免使用工厂并使用扩展ServiceEntityRepository类的 TagRepository 服务,而不是直接使用 EntityRepository。

use AppBundle\Entity\GroupEntity;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

class GroupEntityRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, GroupEntity::class);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您的服务将使用自动装配功能自动注册。

您还可以通过使用组合而不是继承在所有 Symfony 版本中做得更好

final class GroupEntityRepository
{
    /** @var EntityManagerInterface */
    private $entityManager;

    /** @var ObjectRepository */
    private $objectRepository;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
        $this->objectRepository = $this->entityManager->getRepository(GroupEntity::class);
    }
Run Code Online (Sandbox Code Playgroud)

此服务也可以自动装配。您可以通过尊重SOLID 原则并创建一个接口来更进一步。这篇文章中有一个很好的解释(Symfony 中的存储库模式