terminal42/service-annotation-bundle

从类注释添加服务标签

资助包维护!
terminal42
其他

安装次数: 938,637

依赖项: 15

建议者: 0

安全性: 0

星标: 1

关注者: 4

分支: 4

开放性问题: 0

类型:symfony-bundle

1.2.1 2024-08-14 14:01 UTC

This package is auto-updated.

Last update: 2024-09-14 14:56:30 UTC


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
}