如何将参数传递给Symfony2中的验证约束 - 在yml中

时间:2014-04-15 23:29:30

标签: php symfony yaml

我正在尝试向我的应用程序添加一个bundle-wide参数,以便我可以将它添加到我的Validation Constraint文件(validation.yml)中:

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

我在config.yml中正常添加了参数:

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

但页面只是呈现%myvariable%文本,而不是所需的字符串。在将验证消息添加到页面以供JavaScript使用时,我还希望在我的FormBuilderInterface中使用此参数。 yml允许这个吗?如果没有,我如何在更高级别包含这样的参数?

1 个答案:

答案 0 :(得分:1)

不,目前无法实现。

它与YAML或XML甚至服务定义无关。 Validator组件自己读取验证规则 - 正如您所看到的,结构与服务定义完全不同。不幸的是,它并没有取代约束中的参数。

主要逻辑位于由\Symfony\Component\Validator\Mapping\Loader\YamlFileLoader创建的\Symfony\Component\Validator\ValidatorBuilder::getValidator

你可以通过以下方式实现这一目标:

  1. 覆盖validator.builder服务的定义。
  2. 它是使用%validator.builder.factory.class%::createValidatorBuilder构建的,但是因为你必须以某种方式得到参数包,所以没有足够的依赖 - 类工厂正在使用,而不是服务工厂。

    1. 创建新类,扩展ValidatorBuilder
    2. 它应该将参数包带入构造函数或通过setter。它应该在步骤(1)中配置为在此处传递。

      这个类会创建另一个类的文件加载器(见3),也会将该参数包传递给它。

      1. YamlFileLoaderYamlFilesLoader创建新课程。对于您希望支持的每种格式,请额外添加2个。
      2. 它还会将参数包带入构造函数并覆盖某些功能。例如,我认为所有参数处理都可以在newConstraint方法中完成 - 迭代选项,解析参数,然后使用替换选项调用父方法。

        很好,Symfony可以像这样扩展(在这个用例中可能不太好),但我想用自定义约束验证器编写自己的约束会更容易,这将注入参数进入它。

        还要考虑验证器服务的包装器 - 如果您只需要替换验证消息,则可以替换validator服务,将原始服务注入其中。有关详细信息,请参阅http://symfony.com/doc/current/service_container/service_decoration.html

相关问题