tonybogdanov / magic-services-bundle
Symfony 4.0+ / 5.0+ 的自动魔法服务定义生成器
Requires
- php-64bit: ^7.4
- ext-intl: *
- ext-json: *
- doctrine/annotations: 1.*
- nette/php-generator: 3.*
- symfony/console: 4.*|5.*
- symfony/filesystem: 4.*|5.*
- symfony/finder: 4.*|5.*
- symfony/framework-bundle: 4.*|5.*
- symfony/yaml: 4.*|5.*
- tonybogdanov/memoize: ^2.0.1
Requires (Dev)
- symfony/var-dumper: 4.*|5.*
README
安装
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 接口和特质将存在的命名空间。
示例
具有名称 FontManager
的 aware 接口,配置的命名空间为 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接口/特性将使用此名称作为文件夹和类名,分别添加AwareInterface
和AwareTrait
后缀。
伪控制台
有时您可能需要在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
。