如何将我的一个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>