@@ -379,3 +379,99 @@ will share identical locators amongst all the services referencing them::
379
379
}
380
380
381
381
.. _`Command pattern` : https://en.wikipedia.org/wiki/Command_pattern
382
+
383
+ Service Subscriber Trait
384
+ ------------------------
385
+
386
+ .. versionadded :: 4.2
387
+ The :class: `Symfony\\ Component\\ DependencyInjection\\ ServiceSubscriberTrait `
388
+ was introduced in Symfony 4.2.
389
+
390
+ The :class: `Symfony\\ Component\\ DependencyInjection\\ ServiceSubscriberTrait `
391
+ provides an implementation for
392
+ :class: `Symfony\\ Component\\ DependencyInjection\\ ServiceSubscriberInterface `
393
+ that looks through all methods in your class that have no arguments and a return
394
+ type. It provides a ``ServiceLocator `` for the services of those return types.
395
+ The service id is ``__METHOD__ ``. This allows you to easily add dependencies
396
+ to your services based on type-hinted helper methods::
397
+
398
+ // src/Service/MyService.php
399
+ namespace App\Service;
400
+
401
+ use Psr\Log\LoggerInterface;
402
+ use Symfony\Component\DependencyInjection\ServiceSubscriberInterface;
403
+ use Symfony\Component\DependencyInjection\ServiceSubscriberTrait;
404
+ use Symfony\Component\Routing\RouterInterface;
405
+
406
+ class MyService implements ServiceSubscriberInterface
407
+ {
408
+ use ServiceSubscriberTrait;
409
+
410
+ public function doSomething()
411
+ {
412
+ // $this->router() ...
413
+ // $this->logger() ...
414
+ }
415
+
416
+ private function router(): RouterInterface
417
+ {
418
+ return $this->container->get(__METHOD__);
419
+ }
420
+
421
+ private function logger(): LoggerInterface
422
+ {
423
+ return $this->container->get(__METHOD__);
424
+ }
425
+ }
426
+
427
+ This allows you to create helper traits like RouterAware, LoggerAware, etc...
428
+ and compose your services with them::
429
+
430
+ // src/Service/LoggerAware.php
431
+ namespace App\Service;
432
+
433
+ use Psr\Log\LoggerInterface;
434
+
435
+ trait LoggerAware
436
+ {
437
+ private function logger(): LoggerInterface
438
+ {
439
+ return $this->container->get(__CLASS__.'::'.__FUNCTION__);
440
+ }
441
+ }
442
+
443
+ // src/Service/RouterAware.php
444
+ namespace App\Service;
445
+
446
+ use Symfony\Component\Routing\RouterInterface;
447
+
448
+ trait RouterAware
449
+ {
450
+ private function router(): RouterInterface
451
+ {
452
+ return $this->container->get(__CLASS__.'::'.__FUNCTION__);
453
+ }
454
+ }
455
+
456
+ // src/Service/MyService.php
457
+ namespace App\Service;
458
+
459
+ use Symfony\Component\DependencyInjection\ServiceSubscriberInterface;
460
+ use Symfony\Component\DependencyInjection\ServiceSubscriberTrait;
461
+
462
+ class MyService implements ServiceSubscriberInterface
463
+ {
464
+ use ServiceSubscriberTrait, LoggerAware, RouterAware;
465
+
466
+ public function doSomething()
467
+ {
468
+ // $this->router() ...
469
+ // $this->logger() ...
470
+ }
471
+ }
472
+
473
+ .. caution ::
474
+
475
+ When creating these helper traits, the service id cannot be ``__METHOD__ ``
476
+ as this will include the trait name, not the class name. Instead, use
477
+ ``__CLASS__.'::'.__FUNCTION__ `` as the service id.
0 commit comments