Я использую 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
У вас есть представление о проблеме?
Спасибо.
Просто $ validator = new MunicipalityValidator ();
Вот почему это не работает. Вы должны использовать его как службу, получая его из контейнера или внедряя его, или, если вы используете этот способ, вы должны явно передать объекты конструктору
Спасибо. Означает ли это, что я должен создать службу для своего валидатора и вызвать ее с помощью $ this-> get ('municipality_validator') -> myMethod (arg1, arg2, arg3 ...)?
Взгляните на Документ о пользовательских ограничениях и Ограничение с зависимостями
Вы должны опубликовать код, в котором вы используете валидатор, возможно, конструктор форм или в контроллере, или с аннотациями в Entity ... я не знаю. Я имею в виду, добавить больше контекста.
Я использую аннотации в Entity. Когда вызывается мой контроллер, он вызывает MunicipalityFactory для создания объекта Municipality (Entity). MunicipalityFactory вызывает валидатора MunicipalityValidator. При обнаружении ошибок валидатор генерирует исключение, и я использую переводчик для написания сообщения. Код очень простой, потому что в настоящее время это всего лишь образец.
Итак, что вы хотите сделать, так это ввести свой MunicipalityValidator в MunicipalityFactory. И, конечно же, вам нужно будет ввести MunicipalityFactory в свой контроллер. Если ваша фабрика также действует в качестве валидатора, это может немного мешать.
Фактически, мой контроллер вызывает мою фабрику следующим образом: $ municipality = MunicipalityFactory :: create ($ insee, $ zipCode, $ name) В моем MunicipalityFactory я просто хочу вызвать валидатор и выдать исключение в случае неудачной проверки. В моем исключении я хочу использовать TranslatorInterface для перевода сообщения.
Все, что я могу сказать, это сделать шаг назад и просмотреть примеры внедрения зависимостей в документации. Вы не совсем понимаете, что все должно быть определено в контейнере, чтобы все это работало. Статические методы практически не используются. Измените MunicipalityFactory :: create на $ municipalityFactory-> create, и вы будете на правильном пути.
А встраивание переводчика в ваш валидатор - еще одна плохая идея, но она напрямую не связана с проблемами, с которыми вы сталкиваетесь.
Хорошо, спасибо. Я сделаю это. Еще один вопрос: я не обязательно являюсь поклонником статических методов, но я считаю это очень полезным в случае фабрики. Почему вы рекомендуете убрать статику? Где бы я ни видел и не использовал фабрики, они всегда были статичными. Спасибо
Потому что вы не можете внедрить статический метод. Если фабричный класс был полностью самодостаточным, непременно используйте статический метод. Но в этом случае у вас должна быть возможность внедрить зависимости в фабрику, а затем внедрить фабрику. Следовательно, никакой статики.
О да, но поскольку я удалю валидатор, он будет самодостаточным






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