【问题标题】:In Symfony2, can the validation.yml file be split into multiple files using imports?在 Symfony2 中,validation.yml 文件可以使用导入拆分成多个文件吗?
【发布时间】: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

【问题讨论】:

  • “没有用”是什么意思?是抛出异常,还是什么也没发生?
  • 提交的表单没有正确验证,这是不应该发生的。

标签: php symfony yaml


【解决方案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)是 已加载。

更多信息请访问:

【讨论】:

    【解决方案3】:

    Symfony 2.5 打破了上述解决方案。见:https://stackoverflow.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%)?

            【讨论】:

              猜你喜欢
              • 2014-02-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-02-25
              • 2021-04-04
              • 2013-03-01
              相关资源
              最近更新 更多