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


How do I pass a parameter to a validation constraint in Symfony2 - in yml

我正在尝试向我的应用程序添加一个捆绑包范围的参数,以便将其添加到我的验证约束文件(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允许这样做吗?如果没有,如何在更高级别包含这样的参数?

不,目前不可能。

它与YAML、XML甚至服务定义无关。Validator组件自己读取验证规则——正如您所看到的,其结构与服务定义的结构非常不同。遗憾的是,它没有替换约束中的参数。

主逻辑位于由'Symfony'Component'Validator'ValidatorBuilder::getValidator创建的'Symfony'Component'Validator'Mapping'Loader'YamlFileLoader中。

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

  1. 正在重写validator.builder服务的定义

它是使用%validator.builder.factory.class%::createValidatorBuilder构建的,但由于您必须以某种方式获得参数包,因此没有足够的依赖关系——类工厂正在使用,而不是服务工厂。

  1. 正在创建新的类,该类扩展了ValidatorBuilder

它应该将参数包放入构造函数或通过setter。它应该在步骤(1)中进行配置,以便在此处传递。

这个类将创建另一个类的文件加载程序(参见3),并将参数包传递给它

  1. YamlFileLoaderYamlFilesLoader创建新类。对于您想要支持的每种格式,都会增加2个

它将把参数包附加到构造函数中,并覆盖一些功能。例如,我认为所有的参数处理都可以在newConstraint方法中完成——遍历选项,解析参数,然后用替换的选项调用父方法。


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

还要考虑一个围绕验证程序服务的包装器——如果您只需要替换验证消息,您可以替换validator服务,将原始服务注入其中http://symfony.com/doc/current/service_container/service_decoration.html了解更多信息。