В Symfony2 можно ли файл validation.yml разбивать на несколько файлов с помощью импорта?
Прямо сейчас у меня есть файл с именем 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
Добавьте эти строки в 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);
}
Ответ 2
Ответ добавлен в 2015 году
Как и в Symfony 2.7
, файлы ограничений XML и Yaml, расположенные в Resources/config/validation
загружается подкаталог пакета.
До 2.7
только Resources/config/validation.yml
(или .xml) были загружен.
Дополнительная информация:
Ответ 3
Symfony 2.5 нарушил вышеуказанные решения. См.: fooobar.com/questions/324193/...
Ответ 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>
Ответ 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
Это альтернатива 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%
)?
Ответ 8
Начиная с Symfony 3.3 все файлы, присутствующие в YourBundle/Resources/config/validation/*
, зарегистрированы.
Начиная с Symfony 3.4 все файлы, присутствующие в %kernel.project_dir%/config/validator/*
, также зарегистрированы.