Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php symfony2 error.message和error.messageKey之间的差异_Php_Symfony_Twig - Fatal编程技术网

Php symfony2 error.message和error.messageKey之间的差异

Php symfony2 error.message和error.messageKey之间的差异,php,symfony,twig,Php,Symfony,Twig,我正在实现一个简单的自定义登录表单。我举的是两个不同的例子,一个是官方的,另一个是实质上相同但有些不同的。 看一下这两个示例的login.html.twig,其中一个区别在于第一次报告的错误消息报告 <div class="error">{{ error.message|trans }}</div> {{error.message | trans} 而其他报告 div class="error">{{ error.messageKey|trans(error.m

我正在实现一个简单的自定义登录表单。我举的是两个不同的例子,一个是官方的,另一个是实质上相同但有些不同的。 看一下这两个示例的login.html.twig,其中一个区别在于第一次报告的错误消息报告

<div class="error">{{ error.message|trans }}</div>
{{error.message | trans}
而其他报告

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

请回答我的问题:“error.message”和“error.messageKey”之间有什么区别?error.messageData在第二个示例中是什么意思?

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

传递到模板中的错误变量是AuthenticationException的实例。它可能包含有关身份验证失败的更多信息,甚至是敏感信息,请明智地使用它

以及相关的类:

因此,发送到模板的变量
error
为,对象通过以下方式获得:

$error = $authenticationUtils->getLastAuthenticationError();
在第一个示例中,变量
error
是通过以下方式获得的类常量:

$error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR);
以及相关的类:

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

**编辑**

这是对您的评论的回答,两种方法的作用相同

1.第一种方法 因此:

$error=$authenticationUtils->getLastAuthenticationError()

{{error.messageKey | trans(error.messageData,'security')} 将返回:

“发生身份验证异常。”

2.第二种方法 所以

$error=$session->get(securitycontenterface::AUTHENTICATION\u错误)

{{error.message | trans}} 会回来的

存储在会话中的最后一个身份验证错误

在第一种情况下(
error.message | trans
error.message
只保留翻译键

第二个(
error.messageKey | trans(error.messageData,'security')
)稍微复杂一些:

  • 您在
    错误中有消息键。消息键

  • 您拥有的数据将用于在翻译后的字符串中填充占位符(某种类型的
    sprintf('test:%s',messageData)
    请参阅

  • 您拥有消息域
    安全性
    (将消息组织为组的可选方式)请参阅


好的,谢谢你的回答,但有一点不清楚。在我编写的模板中,我使用了两个不同的行(带error.message的div和带error.messageKey的div),而在控制器中,我只将$authenticationUtils->getLastAuthenticationError()作为$error传递。奇怪的是,这两个行都起作用了,而且准确无误{{error.message | trans}}报告的错误消息与我在控制器中传递模板$error作为$session->get(SecurityContedeInterface::AUTHENTICATION_error)时报告的错误消息相同。您能解释一下原因吗?谢谢进一步的解释。
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();
   }
 }
interface SecurityContextInterface extends TokenStorageInterface, AuthorizationCheckerInterface
{
   const AUTHENTICATION_ERROR = Security::AUTHENTICATION_ERROR;
}

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