terminal42 / service-annotation-bundle
从类注释添加服务标签
1.2.1
2024-08-14 14:01 UTC
Requires
- php: ^7.1 || ^8.0
- doctrine/annotations: ^1.6 || ^2.0
- symfony/dependency-injection: ^4.0 || ^5.0 || ^6.0 || ^7.0
- symfony/http-kernel: ^4.0 || ^5.0 || ^6.0 || ^7.0
Requires (Dev)
README
此包允许使用注释向容器服务添加标签。类似于事件的服务订阅者,这允许类在同一个文件中包含所有必要的信息。
如果您在服务定义中使用自动连接和自动配置,这将非常有用,但它也可以在没有这些功能的情况下工作(例如,对于包)。
安装
$ composer.phar require terminal42/service-annotation-bundle ^1.0
之后,请确保在您的内核中启用Terminal42\ServiceAnnotation\Terminal42ServiceAnnotationBundle
。
配置
该包目前不提供任何服务配置。
如何使用
注释可以用于任何在容器中注册的服务。
下面的示例注释等同于以下标签
service: App\EventListener\KernelListener: tags: - { name: monolog.logger, channel: routing } - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
示例
// src/EventListener/KernelListener.php namespace App\EventListener; use Psr\Log\LoggerInterface; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Terminal42\ServiceAnnotationBundle\Annotation\ServiceTag; /** * @ServiceTag("monolog.logger", channel="routing") */ class KernelListener { private $logger; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * @ServiceTag("kernel.event_listener", event="kernel.request") */ public function onKernelRequest(GetResponseEvent $event) { $this->logger->debug('Request for '.$event->getRequest()->getRequestUri()); } }
如果注释添加到方法而不是类,则方法名将自动添加到服务标签 "method" 参数中。
扩展注释
如果您提供的包为其他服务提供新的标签,您可以通过提供自己的注释来改进DX。像PhpStorm这样的好IDE可以提供自动完成支持。
示例
use Doctrine\Common\Annotations\Annotation\Attribute; use Doctrine\Common\Annotations\Annotation\Attributes; use Doctrine\Common\Annotations\Annotation\Target; use Terminal42\ServiceAnnotationBundle\Annotation\ServiceTagInterface; /** * @Annotation * @Target("CLASS") * @Attributes({ * @Attribute("channel", type = "string", required = true), * }) */ class Logger implements ServiceTagInterface { public $channel; public function getName(): string { return 'monolog.logger'; } public function getAttributes(): array { return ['channel' => $this->channel]; } }
将此应用于上面的示例,类注释可以简化如下
// src/EventListener/KernelListener.php namespace App\EventListener; /** * @Logger(channel="routing") */ class KernelListener { // Same class as before }