Ответ * 1000000@stephan.mada, вероятно, решит вашу проблему.
Но я хотел бы отметить небольшую известную аннотацию под названием «@required», которая устраняет необходимость вообще явно настраивать ваш установщик.
use Symfony\Component\Validator\Validator\ValidatorInterface;
trait ValidatorTrait
{
/** @var ValidatorInterface */
protected $validator;
/** @required */
public function injectValidator(ValidatorInterface $validator)
{
$this->validator = $this->validator ?: $validator;
}
}
@required перед методом внедрения заставляет контейнер автоматически внедрять зависимость. Ваш сеттер в services.yaml может полностью исчезнуть. Вы не видите много случаев использования «@required», но он пригодится для часто внедряемых сервисов.
Вы также можете заметить, что я использовал здесь черту. С чертой мне больше не нужен базовый класс или интерфейс. Любой сервис, который использует эту черту, автоматически получает сервис валидатора. Вы можете, конечно, просто использовать обычный класс, если хотите.
class SomeService
{
use ValidatorTrait; // And the validator is now available
use RouterTrait; // As well as the router
И последнее замечание. Я добавил защиту, чтобы гарантировать, что валидатор может быть введен только один раз. Это защищает от мошеннических программистов, у которых может возникнуть соблазн ввести другой валидатор в какой-то другой точке цикла.