Symfony Security 的 getUser 方法无法获取我的用户存储库

getUser method from Symfony Security can't get my User Repository

我的问题是 Symfony Security 的 $this->getUser(); 方法(从 Controller 调用)无法获取我的用户存储库。

The "App\Model\ODM\Repository\UserRepository" document repository implements "Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepositoryInterface", but its service could not be found. Make sure the service exists and is tagged with "doctrine_mongodb.odm.repository_service".

我有一个 CompilerPass,它获取我的存储库并根据某些环境值将它们添加到容器定义中。 我添加了带有“通用”接口(对 ODM 和 ORM 均有效)作为键并使用 Repo FQCN 作为键的 Repo,因此它们应该可以通过通用接口和真正的 Repo 名称访问,但我只使用现在是 ODM。 另外,我用 doctrine_mongodb 参数“标记”我的 repo,以扩展 ServiceDocumentRepository baseClass。

我没有包含 compilerPass,因为 class 相当“重”,但如果需要,我会包含它。

这是我的 UserRepo

class UserRepository extends BaseRepository implements RepositoryInterface, UserRepositoryInterface
{
    /**
     * UserRepository constructor.
     *
     * @param ManagerRegistry $managerRegistry
     */
    public function __construct(ManagerRegistry $managerRegistry)
    {
        parent::__construct($managerRegistry, User::class);
    }

...

我的 BaseRepo(这里只有几个方法,只是 extends 很有趣)

abstract class BaseRepository extends ServiceDocumentRepository implements RepositoryInterface
{
 ...

它在“应用程序内”运行良好,我可以在注册页面上创建一个用户,但在注册后使用 $guardHandler->authenticateUserAndHandleSuccess() 方法,我被重定向到 $this->getUser(); 所在的主页,然后我在上面发布了错误消息。

经过一些研究,问题似乎出在 Doctrine\Bundle\MongoDBBundle\Repository\ContainerRepositoryFactory

这个 class 的 container 似乎没有任何我的 Repo 定义。

我肯定错过了什么,但我不知道在哪里。 我记得几年前做过类似的东西,但扩展了 DocumentRepository 而不是 ServiceDocumentRepository.

如果您需要任何其他信息,请告诉我。

您是否在 services.yml 中启用了自动装配?

services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\Repository\:
        resource: '../src/Repository/*'

既然我找到了解决方案,我觉得这个问题真的很愚蠢......

错误消息中几乎没有,我只需要将 doctrine_mongodb.odm.repository_service 添加到我的 Repo 的定义中,在我的 Compiler Pass

...
$definition->addArgument(new Reference('doctrine_mongodb'));
$definition->addTag('doctrine_mongodb.odm.repository_service');
...

感谢查看我的问题的人,很抱歉浪费您的时间。

我希望这个答案可以帮助其他在 CompilerPass

中注册 Repo 的人

(我将在 2 天内尽快将此答案设置为解决方案)

我会提出我的解决方案,以防其他人遇到此问题而上面的解决方案不起作用。对我来说,有效的方法是在文档 class 中声明存储库时将整个路径放入存储库。像这样:

// /src/Document/User

/**
 * @MongoDB\Document(collection="users", db="database", repositoryClass=\App\Repository\UserRepository::class)
 * @MongoDBUnique(fields="email")
 */
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
    

我不必在我的 Compiler Pass 中添加任何东西。我在其声明中添加了存储库 class 的完整路径,它立即起作用了。希望对你有帮助。