Symfony 4.0 TranslatorInterface не подключается автоматически к классу

Я использую TranslatorInterface в контроллере с автоматическим подключением, и он работает правильно:

public function __construct(LoggerInterface $logger,
                            TranslatorInterface $translator)
{
    $this->_logger = $logger;
    $this->_translator = $translator;
}

Однако, когда я пытаюсь использовать этот интерфейс с автоматическим подключением в другом классе, он не работает:

class MunicipalityValidator
{
    private $_translator;
    private $_validator;

    public function __construct(TranslatorInterface $translator,
                                ValidatorInterface $validator)
    {
        $this->_translator = $translator;
        $this->_validator = $validator;
    }
    //...
}

У меня такое сообщение об ошибке:

FatalThrowableError
Type error: Too few arguments to function App\Validator\MunicipalityValidator::__construct(),
0 passed in /var/www/html/sf4proj/src/Factory/MunicipalityFactory.php on line 34 and
exactly 2 expected

У вас есть представление о проблеме?

Спасибо.

Можете ли вы опубликовать, как вы используете MunicipalityValidator?

Jack Skeletron 18.05.2018 11:31

Просто $ validator = new MunicipalityValidator ();

M4kn4sh 18.05.2018 11:35

Вот почему это не работает. Вы должны использовать его как службу, получая его из контейнера или внедряя его, или, если вы используете этот способ, вы должны явно передать объекты конструктору

Jack Skeletron 18.05.2018 11:37

Спасибо. Означает ли это, что я должен создать службу для своего валидатора и вызвать ее с помощью $ this-> get ('municipality_validator') -> myMethod (arg1, arg2, arg3 ...)?

M4kn4sh 18.05.2018 11:41

Вы должны опубликовать код, в котором вы используете валидатор, возможно, конструктор форм или в контроллере, или с аннотациями в Entity ... я не знаю. Я имею в виду, добавить больше контекста.

Jack Skeletron 18.05.2018 11:48

Я использую аннотации в Entity. Когда вызывается мой контроллер, он вызывает MunicipalityFactory для создания объекта Municipality (Entity). MunicipalityFactory вызывает валидатора MunicipalityValidator. При обнаружении ошибок валидатор генерирует исключение, и я использую переводчик для написания сообщения. Код очень простой, потому что в настоящее время это всего лишь образец.

M4kn4sh 18.05.2018 14:14

Итак, что вы хотите сделать, так это ввести свой MunicipalityValidator в MunicipalityFactory. И, конечно же, вам нужно будет ввести MunicipalityFactory в свой контроллер. Если ваша фабрика также действует в качестве валидатора, это может немного мешать.

Cerad 18.05.2018 14:37

Фактически, мой контроллер вызывает мою фабрику следующим образом: $ municipality = MunicipalityFactory :: create ($ insee, $ zipCode, $ name) В моем MunicipalityFactory я просто хочу вызвать валидатор и выдать исключение в случае неудачной проверки. В моем исключении я хочу использовать TranslatorInterface для перевода сообщения.

M4kn4sh 18.05.2018 15:05

Все, что я могу сказать, это сделать шаг назад и просмотреть примеры внедрения зависимостей в документации. Вы не совсем понимаете, что все должно быть определено в контейнере, чтобы все это работало. Статические методы практически не используются. Измените MunicipalityFactory :: create на $ municipalityFactory-> create, и вы будете на правильном пути.

Cerad 18.05.2018 15:38

А встраивание переводчика в ваш валидатор - еще одна плохая идея, но она напрямую не связана с проблемами, с которыми вы сталкиваетесь.

Cerad 18.05.2018 15:40

Хорошо, спасибо. Я сделаю это. Еще один вопрос: я не обязательно являюсь поклонником статических методов, но я считаю это очень полезным в случае фабрики. Почему вы рекомендуете убрать статику? Где бы я ни видел и не использовал фабрики, они всегда были статичными. Спасибо

M4kn4sh 18.05.2018 16:19

Потому что вы не можете внедрить статический метод. Если фабричный класс был полностью самодостаточным, непременно используйте статический метод. Но в этом случае у вас должна быть возможность внедрить зависимости в фабрику, а затем внедрить фабрику. Следовательно, никакой статики.

Cerad 18.05.2018 16:24

О да, но поскольку я удалю валидатор, он будет самодостаточным

M4kn4sh 18.05.2018 16:31
Стоит ли изучать 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 и хотите разрабатывать...
0
14
453
0

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