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命名空间。在这种情况下,可能会有版本差异。