我有一個config.yml,我想讓開發人員傳遞緩存服務的名稱。將config.yml中指定的Symfony服務注入到包的服務
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']));
}
}
在上線I有一個服務(在配置中指定)的注射轉換爲setCache()方法中的包的內部服務。
但我發現了這一點:
在ServiceNotFoundException的行ContainerBuilder.php 816: 您已請求不存在的服務「緩存」。
即使在配置/ services.yml我已經定義:
services:
cache:
class: Doctrine\Common\Cache\ApcuCache
和文件首先加載。
我該如何將可切換/可配置服務正確注入到該服務的服務中?
謝謝! :-)
[Symfony \ Component \ DependencyInjection \ Exception \ RuntimeException] 如果參數是對象或資源,則無法轉儲服務容器。 這也不會工作:) –
對不起,忘了你必須在編譯器通過使用引用,而不是實際的服務。編輯我的答案。現在您將可以使用服務名稱而不是其類別。 –