doekenorg / decorate-php
基于接口或(抽象)类创建PHP装饰器或代理。
Requires
- php: ^8.1
- composer-plugin-api: ^2.0
Requires (Dev)
- composer/composer: ^2.0
- phpunit/phpunit: ^9.6
This package is auto-updated.
Last update: 2024-09-07 21:08:04 UTC
README
通过简单的(composer)命令轻松创建装饰器和代理。
你喜欢在PHP中使用装饰器,但讨厌用大量方法实现一个装饰器吗?那么这个插件就是为你准备的!你现在可以从接口快速创建一个(最终或抽象)类,其中所有方法都已经实现并转发到下一个实例。这个小工具可以让你专注于喜欢的事情。
安装
composer global require doekenorg/decorate-php
注意:这是一个全局插件,所以不要忘记命令中的global
!
用法
该插件为你的composer
实例添加了一个decorate
命令。它需要一个源类(你想要装饰的接口)和一个目标类。你可以可选地提供它用于下一个类的变量名称。目前,该插件仅适用于composer项目。
创建新的装饰器
composer decorate "Package\Namespace\SomeInterface" "My\Namespace\DestinationClass"
这将在你的psr-4
自动加载配置中映射的相应文件夹中创建并写入名为DestinationClass.php
的文件。
将创建类似的文件
<?php namespace My\Namespace; use Package\Namespace\SomeInterface; class DestinationClass implements SomeInterface { public function __construct(private SomeInterface $next) { } public function any_method(string $variable, ...$variadic_variable): void { $this->next->any_method($variable, ...$variadic_variable); } }
使用特定变量名称创建新的装饰器。
默认情况下,装饰的实例映射到名为$next
的变量。你可以通过提供它作为第三个参数来覆盖它。在下面的例子中,变量将被命名为$client
。
composer decorate "Package\Namespace\ClientInterface" "My\Namespace\MyClient" "client"
输出将类似于以下内容
<?php namespace My\Namespace; use Package\Namespace\ClientInterface; class MyClient implements ClientInterface { public function __construct(private ClientInterface $client) { } // ... }
注意:该命令不会覆盖现有文件。提供--overwrite
选项以强制写入。
选项
命令包含以下选项
--spaces
默认将制表符替换为4
个空格。如果你想要2
个空格,请使用--spaces=2
。你还可以在全局配置中提供默认值(见下一节)。--output
将代码输出到控制台而不是写入文件。--overwrite
将在文件已存在的情况下强制覆盖文件。--abstract
将创建一个abstract
类。现在,next
变量将是protected
而不是private
。--final
将创建一个final
类。
全局配置
你可以在你的全局composer.json
(通常在~/.composer
)中的extra
键中使用以下配置。
{ //... "extra": { "decorate-php": { "spaces": 4, "variable": "next", "use-property-promotion": true, "use-func-get-args": false, "use-final-class": true } } }
spaces
将设置默认缩进为这么多空格;不需要使用--spaces
。variable
将覆盖默认的next
值。use-property-promotion
是否在构造函数中使用属性提升(默认为true
)。use-func-get-args
是否用...func_get_args()
替换方法调用中的实际参数。use-final-class
是否默认创建一个final
类。
其他信息
仅PSR-4
仅支持在项目autoload
键中提供的PSR-4命名空间中写入文件。不支持PSR-0。
不装饰final
类
显然,你不能为final
类创建装饰器。
装饰抽象类
虽然不常见,你也可以装饰abstract
类。在这种情况下,创建装饰器时会忽略任何final
方法。
(装饰非抽象类实际上没有太大用处;但我保留了供我们这些扩展者使用的机会。)
构造函数
当一个 抽象类
或 接口
声明了 __construct
方法时;它将下一个实例作为第一个参数附加。在 抽象类
的情况下,它还会使用适当的参数调用 parent::__construct()
方法。
注意事项
- 因为
composer
在底层使用一些包;它可能会使用那些接口,而不是你项目中的接口。例如:Psr\Container
和Psr\Log
命名空间。在这种情况下,可能会有版本差异。