2013-11-22 4 views
-1

Я пытаюсь улучшить один из моих расширений пакета, которые загружают мои файлы конфигурации YAML, и мне нужно получить доступ к классу ядра, чтобы использовать метод locateResource().Доступ к ядру в класс расширения пакета

Цель состоит в том, чтобы загрузить файлы ресурсов без использования:

__DIR__ . '/../Resources/config' 

класс Extension выглядит следующим образом:

class InnovaPathExtension extends Extension 
{ 
    /** 
    * Base path to the config directory of the bundle 
    * @var unknown 
    */ 
    const CONFIG_PATH = '@InnovaPathBundle/Resources/config/'; 

    /** 
    * List of needed config files 
    * @var array 
    */ 
    protected $filesToLoad = array (
     // Services 
     'services/services.yml', 
     'services/listeners.yml', 
     'services/managers.yml', 
     'services/controllers.yml', 

     // Parameters 
     'parameters.yml', 
    ); 

    /** 
    * @see \Symfony\Component\DependencyInjection\Extension\ExtensionInterface::load() 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     foreach ($this->filesToLoad as $file) { 
      // Check if resources exists 
      try { 
       $resource = static::CONFIG_PATH . $file; 
       $filePath = $container->get('kernel')->locateResource($resource); 
      } catch (\InvalidArgumentException $e) { 
       throw new \InvalidArgumentException(sprintf('Unable to load "%s"', $resource), 0, $e); 
      } 

      // TODO : Load resource 
     } 

     return $this; 
    } 
} 

Инструкция $container->get('kernel') генерирует исключение «определение сервиса„ядро“не существует. '

Если я проверю все услуги, зарегистрированные с $container->getServiceIds(), я нашел один только service_container.

Не проблема, я беру контейнер обслуживания и проверяю услуги с помощью $container->get('service_container')->getServiceIds() ... И я получаю только одну услугу: service_container.

Я не могу понять, почему ... Это DI-CEPTION?

ответ

0

Рекомендуемый способ: не рекомендуется

use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\Config\FileLocator; 

public function load(array $configs, ContainerBuilder $container) 
{ 
    $loader = new YamlFileLoader(
     $container, 
     new FileLocator(__DIR__.'/../Resources/config') 
    ); 

    foreach ($this->filesToLoad as $file) { 
     $loader->load($file); 
    } 
} 

Другие способы.

См http://symfony.com/doc/current/cookbook/bundles/extension.html#loading-external-configuration-resources

+0

Да, это то, что я сделал, прежде чем начать повышение. Я буду использовать 'YamlFileLoader' и' FileLocator', но я хочу удалить ссылку на '__DIR__' в вызове конструктора. – Elorfin

+0

Возможно, но если это касается уведомления SensioInsight, это ошибка положительная. В этом состоянии ядро ​​не загружается по мере того, как вы проверяли и используете __DIR__ - это не плохое решение для кодирования, а ожидаемое решение. Проверьте все основные пакеты от Sensio, KnpLabs, Liip, FOS и т. Д. Это путь! – webda2l

+0

OK. Я не знал 'locateResource' метод, и я думал, что могу использовать его в своем расширении :(. – Elorfin

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