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

col*_*ark 6 php yaml symfony

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

myApp\myBundle\Entity\Contact:
properties:
    name:
      - NotBlank: { message: "%myvariable%" }
Run Code Online (Sandbox Code Playgroud)

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

parameters:
    # Validation config
    myvariable: Please tell us your name.
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*tis 3

不,目前不可能。

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

主要逻辑位于其中,\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 个。

它还会将参数包放入构造函数中并覆盖一些功能。例如,我认为所有参数处理都可以在newConstraint方法中完成 - 迭代选项,解析参数,然后使用替换的选项调用父方法。


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

还可以考虑对验证器服务进行包装 - 如果您只需要替换验证消息,您可以替换该validator服务,将原始消息注入其中。请参阅http://symfony.com/doc/current/service_container/service_decoration.html了解更多信息。