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

Skip to content

Commit 2ef00d3

Browse files
committed
Document how to use named aliases
1 parent a588a92 commit 2ef00d3

File tree

1 file changed

+60
-6
lines changed

1 file changed

+60
-6
lines changed

service_container/autowiring.rst

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,40 @@ 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+
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,34 @@ that alias:
418459
use App\Util\Rot13Transformer;
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->registerAliasForArgument(
470+
TransformerInterface::class,
471+
UppercaseTransformer::class,
472+
'shoutyTransformer'
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