2014-06-05 2 views
6

Этот код работал на Symfony 2.4.5, но он не работает на Symfony 2.5:Как разделить файлы yaml валидации в Symfony 2.5?

Это мой класс HRAPI Extension, который работал в Symfony 2.4.5, но не в 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); 
    } 
} 

Это отображается ошибка:

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

Любые идеи, как это сделать для Symfony 2.5?

+0

Можете ли вы уточнить, что «не работает»? – Maerlyn

+0

Я обновил вопрос. Он говорит: «ParameterNotFoundException: вы запросили несуществующий параметр« validator.mapping.loader.yaml_files_loader.mapping_files ». ' –

ответ

17

Symfony 2.5 изменили способ проверки файлов были загружены. Вот как сделать это сейчас (с помощью компонента Finder для динамической загрузки):

Создание компилятора проход:

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

Затем добавьте этот компилятор пасс в вашем Bundle:

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

Спасибо большое. Это работает отлично. Cheers :) –

+0

Фантастический ответ! – Adam

2

Вы должны использовать ValidatorBuilder#addYamlMappings/ValidatorBuilder#addYamlMapping:

$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

Я попытался, но он говорит: «InvalidArgumentException: определение службы« validator.builder »не существует». –

+0

@CaslavSabani - ваш пакет зарегистрирован * после * FrameworkBundle? В противном случае попробуйте использовать пропуск компилятора –

+0

Что значит «это мой пакет, зарегистрированный после FrameworkBundle»? Я зарегистрировал свой пакет в AppKernel. –

Смежные вопросы