2015-09-03 2 views
1

Как мне вставить один из параметров конфигурации связки в службу?Symfony2 - Доступ к параметрам связки из службы

Когда у меня есть службы, как это:

<!-- My Object FormType --> 
<service id="form.type.my_object" class="My\Bundle\Form\Type\MyObjectType"> 
    <tag name="form.type" alias="my_object"/> 
    <argument type="service" id="doctrine.orm.entity_manager"/> 
    <argument type="service" id="service_container"/> 
    <argument type="string">%my_bundle.some_parameter%</argument> 
</service> 

И я поставил параметр в config.yml:

my_bundle: 
    some_parameter: My\Bundle\Entity\SomeEntityClass 

я получаю эту ошибку:

The service "form.type.my_object" has a dependency on a non-existent parameter "my_bundle.some_parameter". 

Как я могу решить эту проблему (без параметра пакета, указанного в глобальных параметрах приложения)?

EDIT

Я ищу способ без использования parameters.yml.

UPDATE

Это, как загружается мой конфиг:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $configuration = new Configuration(); 

    $config = $this->processConfiguration($configuration, $configs); 
    $container->setParameter('my_bundle.config', $config); 

    $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 

    $serviceFiles = array('form', 'services'); 

    foreach ($serviceFiles as $basename) { 
     $loader->load(sprintf('%s.xml', $basename)); 
    } 
} 
+0

Если вы хотите иметь конфигурации пакета в config.yml, вам нужно будет обработать это в своем пакете ['% your-bundle% \ DependencyInjection \ Configuration'] (http://symfony.com/doc/current/cookbook/bundles/configuration.html) класс. – Yoshi

+0

@Yoshi: спасибо и да, я сделал это, посмотрю обновленный вопрос. – apfz

ответ

0

Определите параметр в "parameters.yml"

parameters: 
    my_bundle: 
     some_parameter: My\Bundle\Entity\SomeEntityClass 

и доступ к нему в вашей службе с помощью: % my_bundle.some_parameter%

+0

Это можно сделать даже с помощью DependencyInjection и Contaneir, вы должны указать его – DonCallisto

+0

в соответствии с последней частью моего вопроса. Я ищу способ перехода без глобальных параметров/parameters.yml – apfz

0

Возможно, ваш файл параметров пакета не загружается вашим пакетом.

Если, например, вы определили свои параметры в вашем parameters.yml в папке MyBundle/Resources/Config, ваше расширение расслоения класс MyBundle/DependencyInjection/MyBundleExtension должно содержать:

public function load(array $configs, ContainerBuilder $container) 
{ 
    configuration = new Configuration(); 
    $config = $this->processConfiguration($configuration, $configs); 

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

EDIT

Другим решение. Просто добавьте строку в свой глобальный файл config.yml с

imports: 
    - { resource: parameters.yml } 
    - { resource: @MyBundle/Resources/config/parameters.yml } 
    - { resource: security.yml } 
0

Я нашел решение. Оказывается, вы можете сделать это очень легко следующим образом:

// My\VendorBundle\DependencyInjection\MyBundleExtension.php 
public function load(array $configs, ContainerBuilder $container) 
{ 
    $configuration = new Configuration(); 

    $config = $this->processConfiguration($configuration, $configs); 
    $container->setParameter('my_bundle.config', $config); 

    $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 

    $this->setBundleParameters($container,$config); 

    $serviceFiles = array('form', 'services'); 

    foreach ($serviceFiles as $basename) { 
     $loader->load(sprintf('%s.xml', $basename)); 
    } 
} 

/** 
* @param ContainerBuilder $container 
* @param $config 
* @return $this 
*/ 
private function setBundleParameters(ContainerBuilder $container, $config) 
{ 
    $container->setParameter('my_bundle.some_parameter', $config['some_parameter']); 

    return $this; 
} 

Теперь, когда я смотрю на него, наверное, я мог бы также использовал это в качестве аргумента:

<!-- My Object FormType --> 
<service id="form.type.my_object" class="My\Bundle\Form\Type\MyObjectType"> 
    ... 
    <argument type="string">%my_bundle.config.some_parameter%</argument> 
</service>