2012-02-22 79 views
16

現在,我有一個名爲validation.yml的文件,在一個文件中驗證所有包的實體。在Symfony2中,可以使用導入將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 
+3

你是什麼意思 「沒有工作」 ?是拋出異常還是什麼都沒有發生? – Problematic 2012-02-22 21:49:33

+0

提交的表單未經正確驗證,不應該發生。 – intrepion 2012-02-22 23:50:03

回答

28

中添加這些行load方法src/Blogger/BlogBundle/DependencyInjection/BloggerBlogExtension.php

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); 
} 
+0

非常感謝!這工作出色!我甚至刪除了validation.yml文件 – intrepion 2012-02-23 17:08:53

+0

@ m2mdas這似乎不能在xml中用xml替換yaml。有不同的合成器嗎?我得到錯誤消息:[]運算符不支持字符串.. – Mick 2012-08-04 14:24:53

+0

@Patt for xml當前參數將是'validator.mapping.loader.xml_files_loader.mapping_files'。 – 2012-08-04 20:59:26

5

您可以添加到您的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

+1。比@ m2mdas的答案要好得多,因爲它只需要對配置進行簡單的更改。剛剛好! – 2013-05-26 12:07:40

1

這是YAML替代@MaksSlesarenko答案。

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/一些束根變量(如%kernel.root_dir%)?

2

上面的解決方案不適用於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 
3

另一種選擇:

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); 
} 

這種方式,使用查找組件,就可以不必關心觸摸每次添加一個新的驗證文件,該文件。

7

答案在2015年

添加作爲Symfony的2.7的,位於束的 Resources/config/validation子目錄XML和YAML約束文件被加載。
2.7之前,只有Resources/config/validation.yml(或.xml)加載了 。

更多信息在: