![](/img/trans.png)
[英]"App\Entity\User object not found by the @ParamConverter annotation"
[英]Let @Security annotation take precedence over ParamConverter
我有一个类似的动作:
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
public function getAction(User $user)
问题在于,ParamConverter的优先级高于@Security
注释。
如果我未被授权并提供现有的电子邮件,我将被重定向到登录页面。 这是预期的和正确的。
但是,当我没有获得授权并提供不存在的电子邮件时,我会收到404消息,指出找不到User
。
我认为授权检查比参数转换更重要。
如何让Security
注释优先于参数转换器?
您可以通过向$user
参数添加null
默认值来避免获取404。
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
getAction(User $user = null) {
if ($user === null) {
return $this->createNotFoundException();
}
...
}
@ParamConverter
和@Entity
都订阅 CONTROLLER
内核事件,而@Security
和@IsGranted
批注都订阅 CONTROLLER_ARGUMENTS
内核事件,该事件在CONTROLLER
之后调度 :
解析控制器参数后,将发生
CONTROLLER_ARGUMENTS
事件。
因此,由于@Security
订阅事件的顺序 , @Security
@ParamConverter
将始终在@ParamConverter
之后执行。 正如我在评论中所说的那样,需要执行顺序才能在安全检查中使用转换后的参数(如此处所示 )。
因此,为了避免您描述的行为,我想您将不得不简单地以不同的方式编写内容。 正如@goto指出的那样,您可以为user
添加默认值,也可以自己检索用户,并完全删除此用例的自动参数转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.