Frage Optionale Parameterabhängigkeit für einen Service


Ich weiß, dass es möglich ist, optionale Dienstabhängigkeiten für einen Dienst hinzuzufügen. Die Syntax ist

arguments: [@?my_mailer]

Aber wie füge ich optional hinzu Parameter Abhängigkeit für eine Dienstleistung?

arguments: [%my_parameter%]

Ich habe es versucht

arguments: [%?my_parameter%]
arguments: [?%my_parameter%]

Aber keiner von beiden funktioniert, ist diese Funktion in SF2 implementiert?


12
2017-09-25 10:15


Ursprung


Antworten:


Ab Symfony 2.4 können Sie Ausdruck dafür verwenden:

Argumente: ["@ = container.hasParameter ('irgendein_param')?   Parameter ('some_param'): 'default_value' "]

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


10
2017-10-14 22:56



Ich denke, wenn Sie den Parameter nicht übergeben / setzen, wird sich Symfony über die Dienstabhängigkeit beschweren. Sie möchten den Parameter optional machen, damit er nicht immer in der Datei config.yml gesetzt werden muss. Und Sie möchten diesen Parameter immer verwenden, wenn er eingestellt ist.

Da ist meine Lösung:

# src/Acme/HelloBundle/Resources/config/services.yml
parameters:
    my_parameter:

services:
    my_mailer:
        class:        "%my_mailer.class%"
        arguments:    ["%my_parameter%"]

Und dann

# 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;
}

Und dann

# 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
    );
}

Sie machen Ihren Parameter optional, indem Sie dem '% Parameter%' einen Standardwert zuweisen.

Bitte lassen Sie mich wissen, wenn Sie bessere Alternativen haben.


8
2018-06-28 01:53



Haben Sie versucht, einen Standardwert für einen Parameter festzulegen? Wie so:

namespace Acme\FooBundle\Services;

class BarService
{
    public function __construct($param = null)
    {
        // Your login
    }
}

und nichts injizierst.


-2
2017-09-30 22:30