tonybogdanov/magic-services-bundle

Symfony 4.0+ / 5.0+ 的自动魔法服务定义生成器

v1.18.2 2020-10-09 06:57 UTC

README

Latest Stable Version License

安装

composer require tonybogdanov/magic-services-bundle

配置

示例

magic_services:
  definitions:
    autowire: false
    autoconfigure: false
    path: '%kernel.project_dir%/config/magic_services.yaml'
    services:
      - '%kernel.project_dir%/src'
  aware:
    path: '%kernel.project_dir%/src/DependencyInjection/Aware'
    namespace: 'App\DependencyInjection\Aware'
    parameters:
      - regex: '/^kernel\.(.+)$/i'
        name: 'ParameterKernel$1'
      - regex: '/^app\.(.+)$/i'
        name: 'ParameterApp$1'
    tags:
      - regex: '/^twig\.(.+)$/i'
        name: 'TagKernel$1'
      - regex: '/^app\.(.+)$/i'
        name: 'TagApp$1'
    services:
      - type: 'Doctrine\Common\Annotations\Reader'
        service: '@Doctrine\Common\Annotations\Reader'
        name: 'AnnotationReader'
      - type: 'Psr\Log\LoggerInterface'
        service: '@logger'
        name: 'Logger'
      - 'Doctrine\ORM\EntityManager'

definitions.autowire

将此设置为 TRUE 以在生成的服务定义中创建一个 _defaults.autowire: true 条目。

默认值: FALSE

definitions.autoconfigure

将此设置为 TRUE 以在生成的服务定义中创建一个 _defaults.autoconfigure: true 条目。

默认值: FALSE

definitions.path

生成的魔法服务定义存储的配置文件路径(必须以 .yml.yaml 结尾)。

请确保加载定义文件。

默认值: '%kernel.project_dir%/config/magic_services.yaml'

definitions.services

查找魔法服务类时扫描的文件夹数组。

默认值: [ '%kernel.project_dir%/src' ]

aware.path

生成 aware 接口和特质所在的文件夹路径。它应该是您包的一部分,以便 composer 可以自动加载文件。

默认值: '%kernel.project_dir%/src/DependencyInjection/Aware'

aware.namespace

所有生成的 aware 接口和特质将存在的命名空间。
示例

具有名称 FontManageraware 接口,配置的命名空间为 App\DependencyInjection\Aware 的最终类名为 App\DependencyInjection\Aware\FontManager\FontManagerAwareInterface

默认值: 'App\DependencyInjection\Aware'

aware.parameters

生成从容器参数生成 aware 接口的定义数组。每个条目都必须是一个数组,或者在自动生成可选设置足够的情况下,也可以使用一个字符串(将用作 regex 子设置)。

默认值: []

aware.parameters.*.regex

匹配容器中定义的一个或多个参数的正则表达式,以生成 aware 接口。

必需,无默认值。

aware.parameters.*.name

生成 aware 接口的可选名称。

您还可以使用正则表达式的捕获组在此处插入匹配的部分。

如果省略,将自动选择一个名称,将匹配参数的名称前面加上一个 parameter 前缀。

例如,对于 kernel.project_dir 参数,将使用以下名称:ParameterKernelProject_Dir

最终的 aware 名称将进行归一化(请参阅归一化)。

aware.tags

生成从标记服务生成 aware 接口的定义数组。每个条目都必须是一个数组,或者在自动生成可选设置足够的情况下,也可以使用一个字符串(将用作 regex 子设置)。

默认值: []

aware.tags.*.regex

匹配容器中定义的一个或多个标记的正则表达式,以生成 aware 接口。

必需,无默认值。

aware.parameters.*.name

生成 aware 接口的可选名称。

您还可以使用正则表达式的捕获组在此处插入匹配的部分。

如果省略,将自动选择一个名称,将匹配参数的名称前面加上一个 parameter 前缀。

例如,对于 kernel.project_dir 参数,将使用以下名称:ParameterKernelProject_Dir

最终的 aware 名称将进行归一化(请参阅归一化)。

aware.services

生成从服务生成 aware 接口的定义数组。每个条目都必须是一个数组,或者在自动生成可选设置足够的情况下,也可以使用一个字符串(将用作 type 子设置)。

默认值: []

aware.services.*.type

aware 接口正在生成的对象的类型。这应该是完整的类或接口名称。

必需,无默认值。

aware.services.*.service

用于依赖注入的配置类型的服务的可选名称。

如果省略,则假定具有配置类型的名称的服务。这对于使用魔法服务或接口很有用。

aware.services.*.name

生成 aware 接口的可选名称。

最终的 aware 名称将进行归一化(请参阅归一化)。

如果省略,将自动从配置类型的基准名称中(在去除Interface后缀后,如果存在)选择一个名称。

例如,对于配置类型Doctrine\Common\Annotations\Reader,选中的名称将是Reader

使用此功能指定更具体的名称以避免重复。

此名称将用于生成最终的aware接口和特性,以及获取器和设置器。

例如,对于AnnotationReader名称和Doctrine\Common\Annotations\Reader类型,以下aware接口和特性将被生成

Configured\Aware\Namespace\AnnotationReader\AnnotationReaderAwareInterface;
Configured\Aware\Namespace\AnnotationReader\AnnotationReaderAwareTrait;

以及以下获取器和设置器

getAnnotationReader(): \Doctrine\Common\Annotations\Reader;
setAnnotationReader( \Doctrine\Common\Annotations\Reader $annotationReader );

命令

services:aware:dump

输出一个资源表,为它们生成aware接口和特性,取决于在magic_services.aware.parameters中配置的参数和在magic_services.aware.services中的服务。

使用--parameters-p来输出参数。
使用--services-s来输出服务。
使用-ps来输出两者。

services:aware:generate

根据在services:aware:dump中发现的描述生成参数和服务的aware接口和特性。

使用--parameters-p来生成参数。
使用--services-s来生成服务。
使用-ps来输出两者。

services:definitions:dump

根据在magic_services.definitions.services中配置的路径输出检测到的魔法服务的表。

使用--previews-p来预览要生成的定义。

services:definitions:generate

为在services:definitions:dump中发现的描述的服务生成服务定义。

magic_services.definitions.path指定的路径中输出定义。

注解

TonyBogdanov\MagicServices\Annotation\MagicService

将此注解添加到您希望生成服务定义的任何类。如果您的类使用aware接口或实现了TonyBogdanov\MagicServices\Aware\ServiceAwareInterface,则不需要添加此注解。

然而,此注解允许您进一步自定义生成的定义

@MagicService(ignore=true)

这将标记被检查的类为被魔法服务定义生成器忽略。

这可能是有用的,当您需要自己编写定义时,但类仍然实现了ServiceAwareInterface(或使用aware接口)并因此被认为是生成对象。

@MagicService(setters=false)

这将标记服务不支持魔法设置器,并且它必须将所有依赖项作为构造函数参数注入。

@MagicService(tags={"console.command","another_tag"})

这允许您指定服务的标签

@MagicService(public=true)

这将标记生成的服务为公共

规范化

在生成最终的aware接口/特性名称时,对输入执行规范化过程。当它是类/接口名称时,仅使用基础名称。

将序列拆分为单词,其中每个单词可能只包含小写或大写拉丁字母、数字和下划线。所有其他内容都替换为单个空格。然后,将所有单词的首字母大写,并删除空格,但保留下划线。

示例

  • kernel.project_dir变为KernelProject_Dir
  • App\Service\FontManager变为FontManager

Aware接口/特性将使用此名称作为文件夹和类名,分别添加AwareInterfaceAwareTrait后缀。

伪控制台

有时您可能需要在Symfony应用程序之外使用魔法服务生成功能。一个例子就是在开发一个包时,如果您没有相应的初始化的Symfony应用程序。

为了简化该工具的使用,它自带一个内置的初始化的微安装程序,仅暴露魔法服务命令。

要使用它,只需在包内找到./bin/console可执行文件,就像使用Symfony的命令行一样使用它,指定包含您魔法服务配置的YAML文件的路径。

示例

./vendor/magic-services-bundle/bin/console /path/to/config/services.yaml services:aware:dump -ps

注意

如果您使用此方法,请注意,您在配置文件中尝试引用的任何参数或服务都将解析为微内核的上下文中。

例如,%kernel.project_dir%参数将解析为魔法服务包的项目目录,而不是调用控制台的应用程序/项目。

为了能够明确地引用本地路径,您可以使用仅在此自定义控制台中可用的魔法参数%__file__%%__dir__%,分别解析为配置文件的路径和配置文件的文件夹,例如/path/to/config/services.yaml/path/to/config