Как сделать перевод сообщений об исключениях в программе проверки пользователей Symfony 4? - PullRequest
0 голосов
/ 24 января 2019

Я проверяю, включен ли пользователь, чтобы он мог войти в систему, и если нет, покажу ему сообщение об ошибке на языке его языка. Это приложение 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.

1 Ответ

0 голосов
/ 24 января 2019

То, как Symfony делает это, переводит сообщение только тогда, когда оно отображается во время рендеринга шаблона, например, в форме входа у вас есть это:

{% if error %}
    <div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}

Другой подход может заключаться в подключении к системе событий Symfony и переводе исключения в EventListener, который перехватывает AuthenticationFailureEvent, слушая AuthenticationEvents::AUTHENTICATION_FAILURE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...