У меня есть config.yml, где я хочу разрешить разработчику передавать имя службы кеша.Внесите службу Symfony, указанную в 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().
Но я получаю это:
ServiceNotFoundException в ContainerBuilder.php линии 816: Вы запросили несуществующий сервис «кэш».
Даже если в конфигурационном/services.yml я определил:
services:
cache:
class: Doctrine\Common\Cache\ApcuCache
и файл загружает в первую очередь.
Как я мог бы правильно включить услугу переключения/конфигурирования в службу связи?
Спасибо! :-)
[Symfony \ Component \ DependencyInjection \ Exception \ RuntimeException] Невозможно сбросить контейнер службы, если параметр является объектом или ресурсом. Это тоже не работает :) –
Извините, вы забыли, что вам нужно использовать ссылку в проходе компилятора вместо фактического сервиса. Отредактировал мой ответ. Теперь вы сможете использовать имя службы вместо своего класса. –