Php 让@Security注释优先于ParamConverter

Php 让@Security注释优先于ParamConverter,php,symfony,Php,Symfony,我有这样一个动作: /** * @Security("is_granted('ROLE_USER_EDITOR')") * @Route("/{email}") * @Method("GET") */ public function getAction(User $user) 问题是ParamConverter优先于@Security注释 如果我未经授权并提供现有电子邮件,我将被重定向到登录页面。这是预期的,也是正确的。 但是,当我未经授权并提供一封不存在的电子邮件时,我会收到一封40

我有这样一个动作:

/**
 * @Security("is_granted('ROLE_USER_EDITOR')")
 * @Route("/{email}")
 * @Method("GET")
 */
public function getAction(User $user)
问题是ParamConverter优先于
@Security
注释

如果我未经授权并提供现有电子邮件,我将被重定向到登录页面。这是预期的,也是正确的。
但是,当我未经授权并提供一封不存在的电子邮件时,我会收到一封404,说找不到
用户

我认为授权检查比参数转换更重要。

如何让
安全性
注释优先于参数转换器?

您可以通过向
$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
都属于
控制器
内核事件,而
@Security
@isgrated
注释属于
控制器参数
内核事件,即:

解析控制器参数后,将发生
CONTROLLER\u ARGUMENTS
事件

因此,
@Security
将始终在
@ParamConverter
之后执行,因为它们已订阅。正如我在评论中所说,为了允许在安全检查中使用转换后的参数(如所示),需要执行此顺序



因此,为了避免你所描述的行为,我想你必须简单地用不同的方式写东西。正如@goto所指出的,您可以为
user
添加一个默认值,或者您也可以自己检索用户,并完全放弃此用例的自动参数转换。

我认为这不是您想要的,而是在参数转换器之前检查
security.yml
文件中的访问控制。我对你的问题投了赞成票,也在等待回答:)谢谢你的建议,但我宁愿自己去找用户。顺便说一下,如果在给
@Security
的表达式中使用转换后的参数,则需要
参数转换器
注释优先于
安全性
注释。感谢您的解释和链接。非常有用。