Symfony2 - 从服务访问捆绑包参数

时间:2015-09-03 11:30:43

标签: symfony

如何将我的一个捆绑配置参数注入服务?

当我有这样的服务时:

<!-- 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".

如何解决这个问题(没有在全局应用程序参数中列出bundle参数)?

修改

我正在寻找一种不使用parameters.yml的方法。

更新

这是我的配置加载方式:

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

3 个答案:

答案 0 :(得分:0)

在&#34; parameters.yml&#34;

中定义参数
parameters:
    my_bundle:
         some_parameter: My\Bundle\Entity\SomeEntityClass

并使用以下命令在您的服务中访问它:%my_bundle.some_parameter%

答案 1 :(得分: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');
}

修改

另一种解决方案。只需在您的全局config.yml文件中添加一行

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

答案 2 :(得分: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>