Как передать параметр в ограничение проверки в Symfony2 – в yml

Я пытаюсь добавить параметр для всего пакета в мое приложение, чтобы добавить его в свой файл ограничений проверки (validation.yml):

myApp\myBundle\Entity\Contact: properties: name: - NotBlank: { message: "%myvariable%" } 

Я обычно добавлял свой параметр в config.yml:

 parameters: # Validation config myvariable: Please tell us your name. 

Но страница просто отображает текст% myvariable%, а не желаемую строку. Я также хочу использовать этот параметр в моем FormBuilderInterface при добавлении сообщений проверки на страницу для использования в JavaScript. Разрешает ли yml это? Если нет, как включить такой параметр на более высокий уровень?

Нет, в настоящее время это невозможно.

Он не имеет ничего общего с YAML или XML или даже определениями сервисов. Компонент Validator считывает правила проверки самостоятельно – как вы можете видеть, структура сильно отличается от определения сервисов. К сожалению, он не заменяет параметры в ограничениях.

Основная логика находится в \Symfony\Component\Validator\Mapping\Loader\YamlFileLoader который создается \Symfony\Component\Validator\ValidatorBuilder::getValidator .

Вы можете сделать это:

  1. Переопределение определения сервиса validator.builder .

Он построен с использованием %validator.builder.factory.class%::createValidatorBuilder , но поскольку вам нужно как-то получить пакет параметров, недостаточно зависимостей – используется фабрика классов, а не фабрика услуг.

  1. Создание нового класса, расширяющего ValidatorBuilder .

Он должен брать пакет параметров в конструктор или через сеттер. Он должен быть сконфигурирован на шаге (1), который должен быть передан здесь.

Этот класс создавал бы загрузчики файлов другого класса (см. 3), также передавал в него этот пакет параметров.

  1. Создание новых классов для YamlFileLoader и YamlFilesLoader . Дополнительно 2 для каждого формата, который вы хотели бы поддержать.

Кроме того, он добавит пакет параметров в конструктор и переопределит некоторые функции. Например, я думаю, что вся обработка параметров может быть выполнена в методе newConstraintnewConstraint через параметры, разрешение параметров, а затем вызов родительского метода с замененными параметрами.


Приятно, что Symfony может быть расширен таким образом (возможно, не так хорошо в этом случае использования), но, я думаю, было бы проще просто написать собственное ограничение с помощью специального механизма проверки ограничений, который бы ввел этот параметр в него.

Также рассмотрите обертку вокруг службы валидатора – если вам просто нужно заменить сообщения проверки, вы можете заменить службу validator , введя в нее оригинал. Дополнительную информацию см. В http://symfony.com/doc/current/service_container/service_decoration.html .