Я проверяю, разрешен ли пользователю вход в систему, а если нет, показываю ему сообщение об ошибке на языке его локали. Это приложение Symfony 4.2. Итак, вот мой пользовательский чекер (который работает):
<?php
namespace App\Security;
use App\Entity\User as AppUser;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class UserChecker implements UserCheckerInterface {
public function checkPreAuth(UserInterface $user)
{
if (!$user instanceof AppUser) {
return;
}
}
public function checkPostAuth(UserInterface $user)
{
/* Make the message translatable */
if (!$user->isEnabled()) {
throw new CustomUserMessageAuthenticationException(
'This account has not been activated.'
);
}
}
}
Обычный подход к переводу строк в Symfony 4 требует изменения подписи:
public function checkPostAuth(UserInterface $user, TranslatorInterface $translator)
Это будет работать в функциях, которые я определяю в контроллерах, но эта проверка пользователей зарегистрирована как служба, используемая в брандмауэре, поэтому мы получаем ошибку:
FatalErrorException
Compile Error: Declaration of App\Security\UserChecker::checkPostAuth(Symfony\Component\Security\Core\User\UserInterface $user, App\Security\TranslatorInterface $translator) must be compatible with Symfony\Component\Security\Core\User\UserCheckerInterface::checkPostAuth(Symfony\Component\Security\Core\User\UserInterface $user)
Я не могу найти документацию о любом другом способе, который работал бы с Symfony 4.






То, как Symfony делает это, переводит сообщение только тогда, когда оно отображается во время рендеринга шаблона, например. в форма входа у вас есть это:
{% if error %}
<div class = "alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
Другим подходом может быть подключение к системе событий Symfony и преобразование исключения в EventListener, который перехватывает AuthenticationFailureEvent, слушая AuthenticationEvents::AUTHENTICATION_FAILURE.