在 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.php
的load
方法中添加这些行。
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 parameters.yml 中获取环境变量