我正在为Symfony 4构建一个可重用的捆绑包,我每5分钟就会卡住一次,这次是关于Doctrine的。
我一直(有点(关注这个文档
在我的捆绑包中,我有一个 User 实体及其存储库,首先我用php bin/console make:user
创建了它们,然后php bin/console make:auth
构建一个简单的登录示例,当所有类和服务都在App
命名空间中时,它可以工作,但我需要一些东西在我的捆绑包中,比如实体和存储库。
当我只移动实体并重写实体及其存储库的命名空间时,它可以工作,但是当我将存储库移动到我的捆绑包中以将它们都放在捆绑包中时,我收到此错误:
"ExampleVendor\AdminBundle\Repository\UserRepository"实体存储库实现了"Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface",但找不到其服务。确保该服务存在并标记为"doctrine.repository_service"。
这是我的存储库类,它是自动生成的。
<?php
namespace ExampleVendorAdminBundleRepository;
use ExampleVendorAdminBundleEntityUser;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrineCommonPersistenceManagerRegistry;
use SymfonyComponentSecurityCoreExceptionUnsupportedUserException;
use SymfonyComponentSecurityCoreUserPasswordUpgraderInterface;
use SymfonyComponentSecurityCoreUserUserInterface;
/**
* @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
中的自动连线和自动配置可能不包括您的自定义捆绑包路径。因此,您需要手动配置并自动连接存储库:
ExampleVendorAdminBundleRepositoryUserRepository:
autowire: true
tags: ['doctrine.repository_service']