令牌不在数据库中时出现控制器错误



我目前正在Symfony 5中为我的网站创建密码重置功能,从昨天开始,一个错误正在杀死我的大脑。

在我的控制器中,我有这个:

/**
* @Route("/reset/{token}", name="reset")
*/
public function reset(User $user, Request $request, UserPasswordEncoderInterface $passwordEncoder, $token)
{ 
//...
}

如果我在我的网站上使用此 URLlocalhost:8000/reset/VALID_TOKEN,一切都已启动并运行。 但是如果令牌无效(数据库中没有出现(,我收到此错误:

@ParamConverter批注找不到应用\实体\用户对象。

我发现这是由于我的函数中的User $user参数,但我不明白Symfony如何处理以及在哪里处理这个User对象。我只是给它一个令牌,他会自动找到相应的用户(这就是我想要的(。

我的目标是防止令牌错误的情况,并将用户重定向到另一个页面。

要访问当前登录的用户(暂时忽略令牌(,可以并且应该通过在控制器中调用$user = $this->getUser();来完成 - 而不是通过将用户添加到方法头(因此将其删除(。

然后,您可以检查:

if($user->getToken() != $token) {
return $this->redirect....
}

你应该删除参数转换器注释,如果这是你想要的。

原答案如下:


User是一个实体,因此不能由Symfony的自动布线提供。控制器函数参数的回退是使用 ParamConverter 使用查询的适当占位符以某种方式从存储库中获取用户。使用{token}(其值(作为标识符(默认情况下id( - 显然也不起作用。使用要查询其token属性为值的用户实体{token}收集该实体不够智能。

这会导致您的错误消息。

如果您确实想使用令牌通过 ParamConverter 获取用户,则必须为其提供有关如何执行此操作的一些提示。

您可以添加以下注释(您可能需要添加 use 子句use SensioBundleFrameworkExtraBundleConfigurationParamConverter;(:

@ParamConverter("user", options={"mapping": {"token": "token"}})

假设令牌是用户实体的一部分并存储在数据库中。

来源: https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

最新更新