2014-06-05 14 views
6

Mã này làm việc cho Symfony 2.4.5 nhưng nó không phải đang làm việc cho Symfony 2.5:Làm cách nào để tách các tệp yaml xác thực trong Symfony 2.5?

Đây là lớp HRAPI mở rộng của tôi đã được làm việc trong Symfony 2.4.5 nhưng không phải trong 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); 
    } 
} 

Nó hiển thị lỗi:

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

Mọi ý tưởng làm cách nào để làm điều đó cho Symfony 2.5?

+0

Bạn có thể giải thích về "không hoạt động" không? – Maerlyn

+0

Tôi đã cập nhật câu hỏi. Nó nói 'ParameterNotFoundException: Bạn đã yêu cầu một tham số không tồn tại "validator.mapping.loader.yaml_files_loader.mapping_files".' –

Trả lời

17

Symfony 2.5 thay đổi cách thức tập tin xác nhận đã được nạp. Dưới đây là làm thế nào để làm điều đó bây giờ (sử dụng thành phần Finder để tự động load):

Tạo một trình biên dịch thông qua:

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

Sau đó, thêm trình biên dịch này vượt qua trong Bundle của bạn:

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

Cảm ơn rất nhiều người. Điều đó hoạt động hoàn hảo. Chúc mừng :) –

+0

Câu trả lời tuyệt vời! – Adam

2

Bạn nên sử dụng 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

Tôi đã thử nhưng nó nói: "InvalidArgumentException: Định nghĩa dịch vụ" validator.builder "không tồn tại." –

+0

@CaslavSabani là gói của bạn đã đăng ký * sau * FrameworkBundle? Nếu không, hãy thử sử dụng một trình biên dịch vượt qua –

+0

Ý của bạn là "gói của tôi được đăng ký sau FrameworkBundle"? Tôi đã đăng ký gói của mình trong AppKernel. –

Các vấn đề liên quan