Необязательная зависимость параметра для службы
Я знаю, что я могу добавить дополнительную службу для службы. Синтаксис
arguments: [@?my_mailer]
Но как добавить дополнительную зависимость параметра для службы?
arguments: [%my_parameter%]
Я пробовал
arguments: [%?my_parameter%]
arguments: [?%my_parameter%]
Но ни одна из них не работает, эта функция реализована в sf2?
Ответы
Ответ 1
Из Symfony 2.4 вы можете использовать выражение для этого:
arguments: [ "@= container.hasParameter('some_param')? Параметр ('some_param'): 'default_value'" ]
Подробнее в http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
Ответ 2
Я думаю, что если вы не передадите/не установите параметр, Symfony будет жаловаться на зависимость службы. Вы хотите сделать параметр необязательным, чтобы он не всегда указывался в файле config.yml. И вы хотите использовать этот параметр всякий раз, когда он установлен.
Есть мое решение:
# src/Acme/HelloBundle/Resources/config/services.yml
parameters:
my_parameter:
services:
my_mailer:
class: "%my_mailer.class%"
arguments: ["%my_parameter%"]
И затем
# you-bundle-dir/DependencyInjection/Configuration.php
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('you_bundle_ns');
// This is for wkhtmltopdf configuration
$rootNode
->children()
->scalarNode('my_parameter')->defaultNull()->end()
->end();
// Here you should define the parameters that are allowed to
// configure your bundle. See the documentation linked above for
// more information on that topic.
return $treeBuilder;
}
И затем
# you-bundle-dir/DependencyInjection/YourBundleExtension.php
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(
'you_bundle_ns.your_parameter',
isset($$config['you_bundle_ns']['your_parameter'])?$$config['you_bundle_ns']['your_parameter']:null
);
}
Вы производите свой параметр, указав значение по умолчанию для параметра%%%
Пожалуйста, дайте мне знать, если у вас есть лучшие альтернативы.
Ответ 3
Вы пытались установить значение по умолчанию для параметра? Например:
namespace Acme\FooBundle\Services;
class BarService
{
public function __construct($param = null)
{
// Your login
}
}
и не вводить ничего.