在 Symfony2 中,validation.yml 文件可以使用导入拆分成多个文件吗?

Posted

技术标签:

【中文标题】在 Symfony2 中,validation.yml 文件可以使用导入拆分成多个文件吗?【英文标题】:In Symfony2, can the validation.yml file be split into multiple files using imports? 【发布时间】:2012-03-13 07:13:34 【问题描述】:

现在,我有一个名为 validation.yml 的文件,在一个文件中验证了捆绑包的所有实体。

validation.yml

Blogger\BlogBundle\Entity\Comment
    properties:
        username:
            - NotBlank:
                message: You must enter your name
            - MaxLength: 50
        comment:
            - NotBlank:
                message: You must enter a comment
            - MinLength: 50

Blogger\BlogBundle\Entity\Enquiry:
    properties:
        name:
            - NotBlank: ~
        email:
            - Email:
                message: symblog does not like invalid emails. Give me a real one!
        subject:
            - NotBlank: ~
            - MaxLength: 50
        body:
            - MinLength: 50

但我想将其拆分为两个文件并将它们都导入。这是我尝试过的,但没有成功:

validation.yml

imports:
    -  resource: comment.yml 
    -  resource: enquiry.yml 

comment.yml

Blogger\BlogBundle\Entity\Comment
    properties:
        username:
            - NotBlank:
                message: You must enter your name
            - MaxLength: 50
        comment:
            - NotBlank:
                message: You must enter a comment
            - MinLength: 50

enquiry.yml

Blogger\BlogBundle\Entity\Enquiry:
    properties:
        name:
            - NotBlank: ~
        email:
            - Email:
                message: symblog does not like invalid emails. Give me a real one!
        subject:
            - NotBlank: ~
            - MaxLength: 50
        body:
            - MinLength: 50

【问题讨论】:

“没有用”是什么意思?是抛出异常,还是什么也没发生? 提交的表单没有正确验证,这是不应该发生的。 【参考方案1】:

src/Blogger/BlogBundle/DependencyInjection/BloggerBlogExtension.phpload 方法中添加这些行。

public function load(array $configs, ContainerBuilder $container)

  //...
  $yamlMappingFiles = $container->getParameter('validator.mapping.loader.yaml_files_loader.mapping_files');
  $yamlMappingFiles[] = __DIR__.'/../Resources/config/comment.yml';
  $yamlMappingFiles[] = __DIR__.'/../Resources/config/enquiry.yml';
  $container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $yamlMappingFiles);

【讨论】:

非常感谢!这工作得非常好!我什至删除了该 validation.yml 文件 @m2mdas 通过用 xml 替换 yaml,这似乎在 xml 中不起作用。有不同的合成器吗?我收到错误消息:字符串不支持 [] 运算符.. @Patt for xml 当前参数为validator.mapping.loader.xml_files_loader.mapping_files 优秀。您的回答确实暴露了 Sf2 框架的灵活性。谢谢。 这个参数在 Symfony 2.5 中被删除了 - 请参阅下面我的答案以获取更新的说明。【参考方案2】:

2015 年添加的答案

从 Symfony 2.7 开始,XML 和 Yaml 约束文件位于 Resources/config/validation 包的子目录已加载。 在2.7 之前,只有Resources/config/validation.yml(或.xml)是 已加载。

更多信息请访问:

Github PR:[FrameworkBundle]“映射”用于验证#13878 Symfony 文档:The Basics of Validation

【讨论】:

【参考方案3】:

Symfony 2.5 打破了上述解决方案。见:https://***.com/a/24210501/175753

【讨论】:

【参考方案4】:

您可以添加到您的 services.xml 中

<parameters>
    <parameter key="validator.mapping.loader.yaml_files_loader.mapping_files" type="collection">
        <parameter>Blogger\BlogBundle\Resources\config\comment.yml</parameter>
        <parameter>Blogger\BlogBundle\Resources\config\enquiry.yml</parameter>
    </parameter>
</parameters>

【讨论】:

+1。比@m2mdas 答案要好得多,因为它只需要对配置进行简单的更改。简直完美!【参考方案5】:

另一种选择:

public function load(array $configs, ContainerBuilder $container)

    $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));

    $validatorFiles = $container->getParameter('validator.mapping.loader.yaml_files_loader.mapping_files');

    $finder = new Finder();
    foreach ($finder->files()->in(__DIR__ . '/../Resources/config/validation') as $file) 
        $validatorFiles[] = $file->getRealPath();
    
    $container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $validatorFiles);

通过这种方式,使用 Finder 组件,您不必担心每次添加新的验证器文件时都会触摸此文件。

【讨论】:

【参考方案6】:

上述解决方案在 Symfony 2.3 中不起作用。

在 2.3 中,从加载器加载多个 Yml 文件更容易。例如:

    $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
    $loader->load('services/menu.yml'); //new file to load

【讨论】:

【参考方案7】:

自 Symfony 3.3 以来,YourBundle/Resources/config/validation/* 中的所有文件都已注册。


由于 Symfony 3.4 存在于 %kernel.project_dir%/config/validator/* 中的所有文件也都已注册。

【讨论】:

【参考方案8】:

这是@MaksSlesarenko 答案的 YAML 替代方案。

parameters:
  validator.mapping.loader.yaml_files_loader.mapping_files:
    - "%kernel.root_dir%/../src/CompanyName/TestBundle/Resources/config/validation/Entity.DbObject.yml"

顺便说一句,有什么方法可以将 %kernel.root_dir%/../src/CompanyName/TestBundle/ 更改为某个 bundle root 变量(如 %kernel.root_dir%)?

【讨论】:

以上是关于在 Symfony2 中,validation.yml 文件可以使用导入拆分成多个文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony2 中使用 GenemuFormBundle

symfony2 电子邮件未在命令中发送

在 symfony2 parameters.yml 中获取环境变量

Symfony2 在 YAML 配置中使用 PHP 类常量?

如何在 symfony2 中进行编辑功能

如何在 Symfony2 控制器中获取操作名称?