@@ -297,6 +297,82 @@ This is done by having ``getSubscribedServices()`` return an array of
297
297
298
298
The above example requires using ``3.2 `` version or newer of ``symfony/service-contracts ``.
299
299
300
+ .. _service-locator_autowire-locator :
301
+
302
+ The AutowireLocator attribute
303
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
304
+
305
+ Another way to define a service locator is to use the
306
+ :class: `Symfony\\ Component\\ DependencyInjection\\ Attribute\\ AutowireLocator `
307
+ attribute::
308
+
309
+ // src/CommandBus.php
310
+ namespace App;
311
+
312
+ use App\CommandHandler\BarHandler;
313
+ use App\CommandHandler\FooHandler;
314
+ use Psr\Container\ContainerInterface;
315
+ use Symfony\Component\DependencyInjection\Attribute\AutowireLocator;
316
+
317
+ class CommandBus
318
+ {
319
+ public function __construct(
320
+ #[AutowireLocator(FooHandler::class, BarHandler::class)]
321
+ private ContainerInterface $locator,
322
+ ) {
323
+ }
324
+
325
+ public function handle(Command $command): mixed
326
+ {
327
+ $commandClass = get_class($command);
328
+
329
+ if ($this->locator->has($commandClass)) {
330
+ $handler = $this->locator->get($commandClass);
331
+
332
+ return $handler->handle($command);
333
+ }
334
+ }
335
+ }
336
+
337
+ Just like with the ``getSubscribedServices() `` method, it is possible
338
+ to define aliased services thanks to named arguments, as well as optional
339
+ services::
340
+
341
+ // src/CommandBus.php
342
+ namespace App;
343
+
344
+ use App\CommandHandler\BarHandler;
345
+ use App\CommandHandler\BazHandler;
346
+ use App\CommandHandler\FooHandler;
347
+ use Psr\Container\ContainerInterface;
348
+ use Symfony\Component\DependencyInjection\Attribute\AutowireLocator;
349
+
350
+ class CommandBus
351
+ {
352
+ public function __construct(
353
+ #[AutowireLocator(
354
+ fooHandlerAlias: FooHandler::class,
355
+ barHandlerAlias: BarHandler::class,
356
+ optionalBazHandlerAlias: '?'.BazHandler::class
357
+ )]
358
+ private ContainerInterface $locator,
359
+ ) {
360
+ }
361
+
362
+ public function handle(Command $command): mixed
363
+ {
364
+ $fooHandler = $this->locator->get('fooHandlerAlias');
365
+
366
+ // ...
367
+ }
368
+ }
369
+
370
+ .. versionadded :: 6.4
371
+
372
+ The
373
+ :class: `Symfony\\ Component\\ DependencyInjection\\ Attribute\\ AutowireLocator `
374
+ attribute was introduced in Symfony 6.4.
375
+
300
376
.. _service-subscribers-locators_defining-service-locator :
301
377
302
378
Defining a Service Locator
0 commit comments