Как сделать сообщения об исключениях переводимыми в средстве проверки пользователя Symfony 4?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
1 811
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме