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 的完整路径,它立即起作用了。希望对你有帮助。
我的问题是 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
(我将在 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 的完整路径,它立即起作用了。希望对你有帮助。