10000 Document how to use named aliases · symfony/symfony-docs@0ddb722 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0ddb722

Browse files
committed
Document how to use named aliases
1 parent a588a92 commit 0ddb722

File tree

1 file changed

+59
-5
lines changed

1 file changed

+59
-5
lines changed

service_container/autowiring.rst

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,41 @@ If you register this as a service, you now have *two* services that implement th
363363
which one to use. Remember, autowiring isn't magic; it looks for a service
364364
whose id matches the type-hint. So you need to choose one by creating an alias
365365
from 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+
372+
For instance, you may want to use by default the ``Rot13Transformer``
373+
implementation when the ``TransformerInterface`` interface is type
374+
hinted, but use the ``UppercaseTransformer`` implementation in some
375+
specific cases. To do so, you can create a normal alias from the
376+
``TransformerInterface`` interface to ``Rot13Transformer,`` and then
377+
create a *named alias* from a special string containing the interface
378+
followed by a variable named you will have to use when doing the
379+
injection::
380+
381+
namespace App\Service;
382+
383+
use App\Util\TransformerInterface;
384+
385+
class MastodonClient
386+
{
387+
private $transformer;
388+
389+
public function __construct(TransformerInterface $shoutyTransformer)
390+
{
391+
$this->transformer = $shoutyTransformer;
392+
}
393+
394+
public function toot($user, $key, $status)
395+
{
396+
$transformedStatus = $this->transformer->transform($status);
397+
398+
// ... connect to Mastodon and send the transformed status
399+
}
400+
}
369401

370402
.. configuration-block::
371403

@@ -378,15 +410,21 @@ that alias:
378410
App\Util\Rot13Transformer: ~
379411
App\Util\UppercaseTransformer: ~
380412
413+
# the ``App\Util\UppercaseTransformer`` service will be
414+
# injected when an ``App\Util\TransformerInterface``
415+
# type-hint for a ``$shoutyTransformer`` argument is detected.
381416
# the ``App\Util\Rot13Transformer`` service will be injected when
382-
# a ``App\Util\TransformerInterface`` type-hint is detected
417+
# an ``App\Util\TransformerInterface`` type-hint is detected,
418+
# but the argument name does not match that of a named alias
383419
App\Util\TransformerInterface: '@App\Util\Rot13Transformer'
420+
App\Util\TransformerInterface $shoutyTransformer: '@App\Util\UppercaseTransformer'
384421
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"/> -->
@@ -419,20 +460,33 @@ that alias:
419460
use App\Util\UppercaseTransformer;
420461
use App\Util\TransformerInterface;
421462
use App\Service\TwitterClient;
463+
use App\Service\MastodonClient;
422464
423465
// ...
424466
$container->autowire(Rot13Transformer::class);
425467
$container->autowire(UppercaseTransformer::class);
426468
$container->setAlias(TransformerInterface::class, Rot13Transformer::class);
469+
$container->registerAliasForArgument(
470+
TransformerInterface::class,
471+
UppercaseTransformer::class,
472+
'shoutyVariable'
473+
);
427474
$container->autowire(TwitterClient::class)
428475
//->setArgument('$transformer', new Reference(UppercaseTransformer::class))
429476
;
477+
$container->autowire(MastodonClient::class);
430478
431479
Thanks to the ``App\Util\TransformerInterface`` alias, any argument type-hinted
432480
with this interface will be passed the ``App\Util\Rot13Transformer`` service.
433-
But, you can also manually wire the *other* service by specifying the argument
481+
If the argument is named ``$shoutyTransformer``,
482+
``App\Util\UppercaseTransformer`` will be used instead.
483+
But, you can also manually wire any *other* service by specifying the argument
434484
under the arguments key.
435485

486+
.. versionadded:: 4.2
487+
488+
Named aliases have been introduced in Symfony 4.2
489+
436490
Fixing Non-Autowireable Arguments
437491
---------------------------------
438492

0 commit comments

Comments
 (0)
0