@@ -363,9 +363,40 @@ If you register this as a service, you now have *two* services that implement th
363363which one to use. Remember, autowiring isn't magic; it looks for a service
364364whose id matches the type-hint. So you need to choose one by creating an alias
365365from the type to the correct service id (see :ref: `autowiring-interface-alias `).
366+ Additionally, you can define several named aliases if you want to use
367+ one implementation in some cases, and another implementation in some
368+ other cases.
366369
367- If you want ``Rot13Transformer `` to be the service that's used for autowiring, create
368- that alias:
370+
371+ For instance, you may want to use by default the ``Rot13Transformer ``
372+ implementation by default when the ``TransformerInterface `` interface is
373+ type hinted, but use the ``UppercaseTransformer `` implementation in some
374+ specific cases. To do so, you can create a normal alias from the
375+ ``TransformerInterface `` interface to ``Rot13Transformer ``, and then
376+ create a *named alias * from a special string containing the interface
377+ followed by a variable name matching the one you use when doing the
378+ injection::
379+
380+ namespace App\Service;
381+
382+ use App\Util\TransformerInterface;
383+
384+ class MastodonClient
385+ {
386+ private $transformer;
387+
388+ public function __construct(TransformerInterface $shoutyTransformer)
389+ {
390+ $this->transformer = $shoutyTransformer;
391+ }
392+
393+ public function toot($user, $key, $status)
394+ {
395+ $transformedStatus = $this->transformer->transform($status);
396+
397+ // ... connect to Mastodon and send the transformed status
398+ }
399+ }
369400
370401.. configuration-block ::
371402
@@ -378,15 +409,22 @@ that alias:
378409 App\Util\Rot13Transformer : ~
379410 App\Util\UppercaseTransformer : ~
380411
381- # the ``App\Util\Rot13Transformer`` service will be injected when
382- # a ``App\Util\TransformerInterface`` type-hint is detected
412+ # the ``App\Util\UppercaseTransformer`` service will be
413+ # injected when an ``App\Util\TransformerInterface``
414+ # type-hint for a ``$shoutyTransformer`` argument is detected.
383415 App\Util\TransformerInterface : ' @App\Util\Rot13Transformer'
384416
417+ # If the argument used for injection does not match, but the
418+ # type-hint still matches, the ``App\Util\Rot13Transformer``
419+ # service will be injected.
420+ App\Util\TransformerInterface $shoutyTransformer : ' @App\Util\UppercaseTransformer'
421+
385422 App\Service\TwitterClient :
386423 # the Rot13Transformer will be passed as the $transformer argument
387424 autowire : true
388425
389- # If you wanted to choose the non-default service, wire it manually
426+ # If you wanted to choose the non-default service and
427+ # do not want to use a named alias, wire it manually
390428 # arguments:
391429 # $transformer: '@App\Util\UppercaseTransformer'
392430 # ...
@@ -405,6 +443,9 @@ that alias:
405443 <service id =" App\Util\UppercaseTransformer" />
406444
407445 <service id =" App\Util\TransformerInterface" alias =" App\Util\Rot13Transformer" />
446+ <service
447+ id =" App\Util\TransformerInterface $shoutyTransformer"
448+ alias =" App\Util\UppercaseTransformer" />
408449
409450 <service id =" App\Service\TwitterClient" autowire =" true" >
410451 <!-- <argument key="$transformer" type="service" id="App\Util\UppercaseTransformer"/> -->
@@ -418,21 +459,33 @@ that alias:
418459 use App\Util\Rot13Transformer;
<
9E88
/code>419460 use App\Util\UppercaseTransformer;
420461 use App\Util\TransformerInterface;
462+ use App\Service\MastodonClient;
421463 use App\Service\TwitterClient;
422464
423465 // ...
424466 $container->autowire(Rot13Transformer::class);
425467 $container->autowire(UppercaseTransformer::class);
426468 $container->setAlias(TransformerInterface::class, Rot13Transformer::class);
469+ $container->setAlias(
470+ TransformerInterface::class.' $shoutyTransformer',
471+ UppercaseTransformer::class
472+ );
427473 $container->autowire(TwitterClient::class)
428474 //->setArgument('$transformer', new Reference(UppercaseTransformer::class))
429475 ;
476+ $container->autowire(MastodonClient::class);
430477
431478 Thanks to the ``App\Util\TransformerInterface `` alias, any argument type-hinted
432479with this interface will be passed the ``App\Util\Rot13Transformer `` service.
433- But, you can also manually wire the *other * service by specifying the argument
480+ If the argument is named ``$shoutyTransformer ``,
481+ ``App\Util\UppercaseTransformer `` will be used instead.
482+ But, you can also manually wire any *other * service by specifying the argument
434483under the arguments key.
435484
485+ .. versionadded :: 4.2
486+
487+ Named aliases have been introduced in Symfony 4.2.
488+
436489Fixing Non-Autowireable Arguments
437490---------------------------------
438491
0 commit comments