Symfony2 -从服务访问bundle参数



如何将我的一个bundle配置参数注入到服务中?

当我有这样的服务:

<!-- My Object FormType -->
<service id="form.type.my_object" class="MyBundleFormTypeMyObjectType">
  <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: MyBundleEntitySomeEntityClass

我得到这个错误:

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

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

编辑

我正在寻找一种不使用参数的方法。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));
    }
}

在"parameters.yml"中定义您的参数

parameters:
    my_bundle:
         some_parameter: MyBundleEntitySomeEntityClass
%my_bundle.some_parameter%

可能你的bundle没有加载参数文件

如果,例如,你在MyBundle/Resources/Config文件夹的parameters.yml中定义了你的参数,你的包扩展类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');
}

编辑

另一个解决方案。只需在全局配置中添加一行。Yml文件

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

我已经找到解决办法了。事实证明,您可以通过以下方式很容易地做到这一点:

// MyVendorBundleDependencyInjectionMyBundleExtension.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="MyBundleFormTypeMyObjectType">
  ...
  <argument type="string">%my_bundle.config.some_parameter%</argument>
</service>

最新更新