我正在实现一个简单的自定义登录表单.我遵循的是两个不同的示例,官方的一个是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