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

Skip to content

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

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