2012-02-22 17 views
16

W tej chwili mam plik o nazwie validation.yml z walidacją wszystkich encji pakietu w jednym pliku.Czy w pliku Symfony2 plik validation.yml można podzielić na wiele plików przy użyciu importu?

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 

Ale chciałbym podzielić go na dwa pliki i importować je obie. To co próbowałem i to nie działa:

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

Co to znaczy "nie działa" ? Czy wyjątek został rzucony, czy nic się nie stało? – Problematic

+0

Formularz przesłany bez prawidłowej walidacji, co nie powinno mieć miejsca. – intrepion

Odpowiedz

28

Dodaj te linie w load metoda z 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

Dziękuję bardzo! To działało wspaniale! Usunąłem nawet ten plik validation.yml. – intrepion

+0

@ m2mdas Wydaje się, że to nie działa w xml, zastępując yaml przez xml. Czy jest inna syntaktyka? Pojawia się komunikat o błędzie: operator [] nie jest obsługiwany dla łańcuchów znaków. – Mick

+0

@Patt dla xml bieżący parametr będzie miał postać 'validator.mapping.loader.xml_files_loader.mapping_files'. –

5

Można dodać do 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. Znacznie lepiej niż odpowiedź @ m2mdas, ponieważ wymaga to jedynie prostej zmiany w konfiguracji. Po prostu perfekcyjnie! –

1

To YAML alternatywą @MaksSlesarenko odpowiedź.

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

BTW czy jest jakiś sposób aby zmienić %kernel.root_dir%/../src/CompanyName/TestBundle/ pewnym wiązki korzeń zmiennej (jak %kernel.root_dir%)?

2

Powyższe rozwiązania nie działają w Symfony 2.3.

W wersji 2.3 łatwiej jest załadować wiele plików Yml z programu ładującego. Na przykład:

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

Innym alternatywnym:

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

ten sposób, przy użyciu składnika Finder, nie trzeba obawiać się o dotknięcie tego pliku za każdym razem dodać nowy plik walidatora.

7

Odpowiedź dodana w 2015

Jak Symfony 2.7, pliki XML i yaml ograniczające znajdujące się w podkatalogu wiązki Resources/config/validation są ładowane.
Przed 2.7 tylko Resources/config/validation.yml (lub .xml) zostały załadowane .

Więcej informacji na:

Powiązane problemy