【发布时间】:2016-11-07 07:13:29
【问题描述】:
我有一个 config.yml,我想在其中允许开发人员传递缓存服务的名称。
file_repository:
cache_service: "cache"
现在我有了捆绑包配置
<?php
namespace Wolnosciowiec\FileRepositoryBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/**
* @package Wolnosciowiec\FileRepositoryBundle\DependencyInjection
*/
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('file_repository');
$rootNode
->children()
->scalarNode('cache_service')
->isRequired()
->end()
->end()
;
return $treeBuilder;
}
}
我有扩展名:
<?php
namespace Wolnosciowiec\FileRepositoryBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
/**
* @package Wolnosciowiec\FileRepositoryBundle\DependencyInjection
*/
class FileRepositoryExtension extends Extension
{
/**
* Load configuration definition from "Configuration.php"
*
* @param array $configs
* @param ContainerBuilder $container
*/
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('services.yml');
// inject the cache service into the Comrade Reader
$comrade = $container->getDefinition('wolnosciowiec.comrade.reader');
$comrade->addMethodCall('setCache', $container->get($config['cache_service']));
}
}
在最后几行中,我在 setCache() 方法中将服务(在配置中指定)注入到包的内部服务中。
但我明白了:
ContainerBuilder.php 第 816 行中的 ServiceNotFoundException: 您请求了一个不存在的服务“缓存”。
即使在 config/services.yml 我已经定义:
services:
cache:
class: Doctrine\Common\Cache\ApcuCache
文件首先加载。
如何将可切换/可配置服务正确地注入到捆绑包的服务中?
谢谢! :-)
【问题讨论】:
标签: php symfony dependency-injection bundle