doekenorg/decorate-php

基于接口或(抽象)类创建PHP装饰器或代理。

安装: 4

依赖: 0

建议者: 0

安全性: 0

星标: 28

关注者: 1

分支: 0

开放问题: 2

类型:composer-plugin

v0.1.0 2024-01-05 13:37 UTC

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