2012-02-22 11 views
16

En este momento, tengo un archivo llamado validation.yml con la validación de todas las entidades del paquete en un archivo.En Symfony2, ¿el archivo validation.yml se puede dividir en varios archivos mediante importaciones?

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 

Pero me gustaría que dividirlo en dos archivos e importar los dos. Esto es lo que he intentado y no funcionó:

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

¿Qué quiere decir "no funcionó" ? ¿Fue una excepción lanzada o no pasó nada? – Problematic

+0

El formulario enviado sin validar correctamente, lo que no debería haber sucedido. – intrepion

Respuesta

28

Añadir estas líneas en load método de 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

¡Muchas gracias! ¡Esto funcionó espléndidamente! Incluso eliminé ese archivo validation.yml – intrepion

+0

@ m2mdas Esto no parece funcionar en xml reemplazando yaml por xml. ¿Hay una sintaxis diferente? Aparece el mensaje de error: operador [] no compatible con cadenas. – Mick

+0

@Patt para xml el parámetro actual sería 'validator.mapping.loader.xml_files_loader.mapping_files'. –

5

se pueden agregar a su 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. Mucho mejor que @ m2mdas, porque solo requiere un cambio simple en la configuración. ¡Simplemente perfecto! –

1

Ésta es YAML alternativa a la respuesta @MaksSlesarenko.

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

Por cierto ¿hay alguna manera de cambiar a algún %kernel.root_dir%/../src/CompanyName/TestBundle/paquete raíz variable (como %kernel.root_dir%)?

2

Las soluciones anteriores no funcionan en Symfony 2.3.

En 2.3 es más fácil cargar múltiples archivos YML desde el cargador. Por ejemplo:

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

Otra alternativa:

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

De esta manera, mediante el componente Finder, usted no tiene que preocuparse por tocar este archivo cada vez que se agrega un nuevo archivo de validación.

7

respuesta añadió en 2015

A partir de Symfony 2.7, archivos XML y restricción Yaml ubicados en el subdirectorio de Resources/config/validation de un paquete se cargan.
Antes de 2.7, solo Resources/config/validation.yml (o .xml) eran cargados.

Más información en:

Cuestiones relacionadas