2014-06-05 9 views
6

Dieser Code arbeitete für Symfony 2.4.5 aber es funktioniert nicht für Symfony 2.5:Wie teilt man Validierung Yaml-Dateien in Symfony 2.5?

Das ist meine HRAPI Erweiterung Klasse, die es in Symfony 2.4.5 aber nicht in Symfony 2,5

<?php 

namespace HardCoreMore\HRAPIBundle\DependencyInjection; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\Config\FileLocator; 
use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\DependencyInjection\Loader; 

/** 
* This is the class that loads and manages your bundle configuration 
* 
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html} 
*/ 
class HRAPIExtension extends Extension 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

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

     // load validation configuration 
     $yamlMappingFiles = $container->getParameter('validator.mapping.loader.yaml_files_loader.mapping_files'); 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/site_user.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/human_resource.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/tag.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/company.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/programming_language.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/technology.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/language.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/management.yml'; 
     $yamlMappingFiles[] = __DIR__.'/../Resources/config/validation/calendar_entry.yml'; 
     $container->setParameter('validator.mapping.loader.yaml_files_loader.mapping_files', $yamlMappingFiles); 
    } 
} 

arbeitet zeigt Fehler an:

ParameterNotFoundException: You have requested a non-existent parameter "validator.mapping.loader.yaml_files_loader.mapping_files".

Irgendwelche Ideen, wie man es für Symfony 2.5 macht?

+0

Können Sie näher ausführen "funktioniert nicht"? – Maerlyn

+0

Ich habe die Frage aktualisiert. Es heißt 'ParameterNotFoundException: Sie haben einen nicht vorhandenen Parameter "validator.mapping.loader.yaml_files_loader.mapping_files" angefordert.' –

Antwort

17

Symfony 2.5 verändert die Art und Weise wurden Validierungsdateien geladen. Hier ist, wie es jetzt zu tun (mit der Finder-Komponente dynamisch laden):

erstellen Compiler Pass:

namespace MyBundle\DependencyInjection\Compiler; 

use Symfony\Component\Finder\Finder; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\Config\Resource\DirectoryResource; 

class ValidatorPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     $validatorBuilder = $container->getDefinition('validator.builder'); 
     $validatorFiles = array(); 
     $finder = new Finder(); 

     foreach ($finder->files()->in(__DIR__ . '/../../Resources/config/validation') as $file) { 
      $validatorFiles[] = $file->getRealPath(); 
     } 

     $validatorBuilder->addMethodCall('addYamlMappings', array($validatorFiles)); 

     // add resources to the container to refresh cache after updating a file 
     $container->addResource(new DirectoryResource(__DIR__ . '/../../Resources/config/validation')); 
    } 
} 

Dann fügen Sie diesen Compiler Pass in Ihrem Paket enthält:

namespace MyBundle; 

use Symfony\Component\HttpKernel\Bundle\Bundle; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use MyBundle\DependencyInjection\Compiler\ValidatorPass; 

class MyBundle extends Bundle 
{ 
    // . . . . 

    public function build(ContainerBuilder $container) 
    { 
     parent::build($container); 

     $container->addCompilerPass(new ValidatorPass()); 
    } 

    // . . . .  
} 
+0

Vielen Dank, Mann. Das funktioniert perfekt. Prost :) –

+0

Fantastische Antwort! – Adam

2

sollten Sie ValidatorBuilder#addYamlMappings/ValidatorBuilder#addYamlMapping verwenden:

$builderDefinition = $container->getDefinition('validator.builder'); 
$builderDefinition->addMethodCall('addYamlMappings', array(
    array(
     __DIR__.'/../Resources/config/validation/site_user.yml'; 
     __DIR__.'/../Resources/config/validation/human_resource.yml'; 
     __DIR__.'/../Resources/config/validation/tag.yml'; 
     __DIR__.'/../Resources/config/validation/company.yml'; 
     __DIR__.'/../Resources/config/validation/programming_language.yml'; 
     __DIR__.'/../Resources/config/validation/technology.yml'; 
     __DIR__.'/../Resources/config/validation/language.yml'; 
     __DIR__.'/../Resources/config/validation/management.yml'; 
     __DIR__.'/../Resources/config/validation/calendar_entry.yml' 
    ) 
)); 
+1

Ich habe versucht, aber es heißt: "InvalidArgumentException: Die Service-Definition" validator.builder "existiert nicht." –

+0

@CaslavSabani ist dein Bundle registriert * nach * dem FrameworkBundle? Versuchen Sie andernfalls, einen Compiler-Durchlauf zu verwenden. –

+0

Was meinen Sie "ist mein Bundle nach dem FrameworkBundle registriert"? Ich habe mein Bundle im AppKernel registriert. –