2016-05-31 12 views
1

In einer Service-Definition, spritze ich einen Wert über Ausdruckssprache:Wie erreicht man so etwas wie einen Ausdruck in einem Parameter, der in einen Service injiziert wird?

someService: 
    arguments: 
     - "@=service('otherService').getValue()" 

nun einige, ein anderer Dienst den gleichen Wert braucht, so dass ich dachte, ich könnte:

parameter: 
    leValue: "@=service('otherService').getValue()" 

someService: 
    arguments: 
     - "%leValue%" 

yetAnotherService: 
    arguments: 
     - "%leValue" 

Doch dies verdient mir eine Ausnahme:

Sie nicht einen Behälter mit Parameter-Dump können, die Verweise auf andere Dienste

enthalten

Bummer. Gibt es eine andere Möglichkeit, einen Ausdruck zu speichern? Ich wiederhole den vollen Ausdruck nicht jedes Mal, wenn ich ihn brauche, und ich bin nicht darauf fixiert, einen Parameter zu verwenden. Mein Ziel ist es, ein wenig syntaktischen Zucker zu erreichen.

Antwort

1

Diese Frage hat eine ähnliche Antwort here

Sie haben Aliasing verwenden

Exemple:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $configuration = new Configuration; 
    config = $this->processConfiguration($configuration, $configs); 

    $loader = new Loader\YamlFileLoader(
    $container, 
    new FileLocator(__DIR__.'/../Resources/config') 
); 
$loader->load('services.yml'); 

$alias = $config['mailer']['driver']; 
$container->setAlias('my_scope.mailer_driver', $alias); 

}

Und in Ihrem Service.yml:

services: 
my_scope.mailer_driver: 
    alias: my_scope.mailer_driver_smtp # Fallback 

my_scope.mailer_driver_smtp: 
    class: My\Scope\Driver\Smtp 

my_scope.mailer_driver_mock: 
    class: My\Scope\Driver\Mock 

my_scope.mailer: 
    class: My\Scope\Mailer 
    arguments: 
     - @my_scope.mailer_driver