微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-symfony2 error.message和error.messageKey之间的区别

我正在实现一个简单的自定义登录表单.我遵循的是两个不同的示例,官方的一个http://symfony.com/doc/current/cookbook/security/form_login_setup.html,另一个一个https://knpuniversity.com/screencast/symfony2-ep2/logout#play,它们基本上相同,但有所不同.
看两个示例的login.html.twig,其中一个区别是错误消息报告,第一个报告

<div class="error">{{ error.message|trans }}</div>

而其他报告

div class="error">{{ error.messageKey|trans(error.messageData, 'security') }}</div>

请问我这里的问题:“ error.message”和“ error.messageKey”之间有什么区别?在第二个示例中error.messageData意味着什么?

解决方法:

在第二个示例中,根据您提供的文档:

“传递给模板的错误变量是AuthenticationException的一个实例.它可能包含有关身份验证失败的更多信息-甚至是敏感信息,因此请明智地使用它!”

和相关的类:

http://api.symfony.com/2.7/Symfony/Component/Security/Core/Exception/AuthenticationException.html

因此,发送到模板的变量错误是和通过以下方式获得的对象:

$error = $authenticationUtils->getLastAuthenticationError();

在第一个示例中,variableerroris类常量是通过以下方式获得的:

$error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR);

和相关的类:

http://api.symfony.com/2.0/Symfony/Component/Security/Core/SecurityContextInterface.html

因此,您可以注意到两个变量错误仅共享相同的名称!它们不是同一类的实例

**编辑**

这是对您的评论的回答,两种方法都可以完成相同的工作

1.第一种方法

class AuthenticationUtils
{
    /**
     * @param bool $clearSession
     *
     * @return AuthenticationException|null
     */
    public function getLastAuthenticationError($clearSession = true)
    {
        $request = $this->getRequest();
        $session = $request->getSession();
        $authenticationException = null;

        if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
            $authenticationException = $request->attributes->get(Security::AUTHENTICATION_ERROR);
        } elseif ($session !== null &&   $session->has(Security::AUTHENTICATION_ERROR)) {
            $authenticationException = $session->get(Security::AUTHENTICATION_ERROR);

            if ($clearSession) {
                $session->remove(Security::AUTHENTICATION_ERROR);
            }
        }

        return $authenticationException;
    }



class AuthenticationException extends \RuntimeException implements \Serializable
  {


   /**
    * Message key to be used by the translation component.
    *
    * @return string
    */
   public function getMessageKey()
   {
       return 'An authentication exception occurred.';
   }

   /**
    * Message data to be used by the translation component.
    *
    * @return array
    */
   public function getMessageData()
   {
       return array();
   }
 }

因此:

$error = $authenticationUtils->getLastAuthenticationError();

其次是

{{ error.messageKey|trans(error.messageData, ‘security’) }}

将返回 :

‘An authentication exception occurred.’

2.第二种方法

interface SecurityContextInterface extends TokenStorageInterface, AuthorizationCheckerInterface
{
   const AUTHENTICATION_ERROR = Security::AUTHENTICATION_ERROR;
}

final class Security
{
    const AUTHENTICATION_ERROR = '_security.last_error';
}

所以

$error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR);

其次是

{{ error.message|trans }}

将返回

the last authentication error stored in session

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐