如何在自定义包中使用存储库?

How to use Repositories inside a custom bundle?

我正在为 Symfony 4 构建一个可重用的包,我每 5 分钟就会卡住一次,这次是关于 Doctrine。

我一直(有点)关注这个doc

在我的包中,我有一个用户实体及其存储库,首先我使用 php bin/console make:user 创建它们,然后 php bin/console make:auth 构建一个简单的登录示例,它在所有 classes 和服务在 App\ 命名空间中,但我需要在我的包中添加一些东西,比如实体和存储库。

当我只移动实体并重写实体及其存储库的名称空间时,它可以正常工作,但是当我将存储库移动到我的捆绑包以将它们都放在捆绑包中时,我收到此错误:

The "ExampleVendor\AdminBundle\Repository\UserRepository" entity repository implements "Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface", but its service could not be found. Make sure the service exists and is tagged with "doctrine.repository_service".

这是我的存储库 class,它是自动生成的。

<?php

namespace ExampleVendor\AdminBundle\Repository;

use ExampleVendor\AdminBundle\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @method User|null find($id, $lockMode = null, $lockVersion = null)
 * @method User|null findOneBy(array $criteria, array $orderBy = null)
 * @method User[]    findAll()
 * @method User[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, User::class);
    }

    /**
     * Used to upgrade (rehash) the user's password automatically over time.
     */
    public function upgradePassword(UserInterface $user, string $newEncodedPassword): void
    {
        if (!$user instanceof User) {
            throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user)));
        }

        $user->setPassword($newEncodedPassword);
        $this->_em->persist($user);
        $this->_em->flush();
    }
}

错误说了一些关于 ServiceEntityRepositoryInterface 但存储库没有直接实现它,它扩展了 ServiceEntityRepository 我猜是实现 ServiceEntityRepositoryInterface 的那个,所以我应该将 ServiceEntityRepository 注入我的存储库?怎么做?我该怎么办?

services.yaml 中的自动装配和自动配置可能不包括您的自定义包路径。因此,您需要手动配置和自动装配您的存储库:

ExampleVendor\AdminBundle\Repository\UserRepository:
    autowire: true
    tags: ['doctrine.repository_service']