Чтобы разрешить определение класса службы в конфигурации, вы должны использовать семантическую конфигурацию (как упомянуто выше).Ниже приведен пример:
Вот простая служба (служба может быть любого класса php):
<?php
namespace Sample\Bundle\ServiceBundle\Service;
class Awesomeness {
public function doSomething()
{
return 'I did something';
}
}
Существует несколько способов подключить службу к контейнеру службы Symfony2.Для этого примера мы создадим файл services.xml в ServiceBundle / Resources / config (это описано во всех документах Symfony2):
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="sample_service_bundle.awesomess" class="%sample_service_bundle.awesomeness.class%">
</service>
</services>
</container>
Обратите внимание, что я не добавил стандартный раздел в службы.xml.Это намеренно.Мы будем модифицировать класс расширения пакета и класс семантической конфигурации для добавления параметра из config.yml.
Чтобы разрешить определение класса обслуживания в конфигурации, мы сначала добавим конфигурацию в DependencyInjection / Configuration.php.:
class Configuration implements ConfigurationInterface
{
/**
* {@inheritDoc}
*/
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('brain_glove_site');
$rootNode
->children()
->scalarNode('awesomeness_class')->cannnotBeEmpty()->defaultValue('Sample\\Bundle\\ServiceBundle\\Service\\Awesomeness')->end()
->end()
;
return $treeBuilder;
}
}
Здесь мы создали новый параметр конфигурации с именем 'awesomeness_class', который можно установить в config.yml, и предоставили ему значение по умолчанию.
Однако нам все еще нужно создатьфактический параметр, который служба может использовать.Это делается в классе расширения, который будет использовать ваш пакет.Если ваш пакет называется SampleServiceBundle, то класс, который вы редактируете, будет DependencyInjection \ SampleServiceExtension:
class SampleServiceExtension extends Extension
{
/**
* {@inheritDoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.xml');
$container->setParameter('sample_service_bundle.awesomeness.class', $config['awesomeness_class']);
}
}
Вызов метода $ container-> setParameter () вводит параметр в ваш контейнер, который затем будет использоваться вашимопределение службы.
На этом этапе вам больше ничего не нужно делать, чтобы использовать службу как обычно.
Если вы хотите изменить класс, который создается службой в конфигурации, вы можетеedit config_dev.yml:
...
sample_service:
awesomeness_class: SomeOtherBundle/SomeOtherClass
И теперь ваше приложение будет использовать другой класс для этой службы.