2014-06-05 20 views
6

此代碼工作了Symfony的2.4.5,但它不工作的Symfony 2.5:如何拆分Symfony 2.5中的驗證yaml文件?

這是在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); 
    } 
} 

工作我HRAPI擴展類It顯示錯誤:

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改爲驗證的文件加載的方式。這裏是如何做到這一點,現在(使用查找組件動態加載):

創建編譯過程:

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

然後,在你的包添加此編譯過程:

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

非常感謝。這是完美的。乾杯:) –

+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之後註冊的bundle嗎?否則,請嘗試使用編譯器傳遞 –

+0

你是什麼意思「我的bundle是在FrameworkBundle之後註冊的」?我已經在AppKernel中註冊了我的包。 –