Optional parameter dependency for a service Optional parameter dependency for a service symfony symfony

Optional parameter dependency for a service


From Symfony 2.4 you can use expression for this:

arguments: ["@=container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"]

More at http://symfony.com/doc/current/book/service_container.html#using-the-expression-language


I think that if you don't pass/set the parameter, Symfony will complain about the service dependency. You want to make the parameter optional so that it is not required to always set in the config.yml file. And you want to use that parameter whenever it is set.

There is my solution:

# src/Acme/HelloBundle/Resources/config/services.ymlparameters:    my_parameter:services:    my_mailer:        class:        "%my_mailer.class%"        arguments:    ["%my_parameter%"]

And then

# you-bundle-dir/DependencyInjection/Configuration.phppublic 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;}

And then

# you-bundle-dir/DependencyInjection/YourBundleExtension.phppublic 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    );}

You make the your parameter optional by giving default value to the '%parameter%'

Please let me know if you have better alternatives.


Did you try to set a default value for a parameter? Like so:

namespace Acme\FooBundle\Services;class BarService{    public function __construct($param = null)    {        // Your login    }}

and not injecting anything.