ssnepenthe/apheleia-cli

编写 WP-CLI 命令的替代语法

0.1.0 2022-07-05 20:31 UTC

This package is auto-updated.

Last update: 2024-09-20 22:07:33 UTC


README

Apheleia CLI 提供了编写 WP-CLI 命令的替代方法。它消除了文档块命令定义的需求,应该允许您充分利用您最喜欢的编辑器的自动完成功能。

Apheleia 命令的语法大致模仿了 symfony/console 包。

警告

此软件包目前正在开发中,在 v1.0 标签发布之前,可能会进行破坏性更改,恕不另行通知。

这是我在探索使 WordPress 的工作方式更现代化的方法时制作的一系列 WordPress 玩具 之一。

正如标签所示,它应该被视为一个玩具。

安装

composer require ssnepenthe/apheleia-cli

用法

我认为最好通过示例来解释这一点,让我们演示一些实现 example hello 命令(来自 WP-CLI 手册命令配方)的不同方法

首选方法是创建自包含的命令类。

使用 configure 方法扩展 Command 类以定义命令签名,并使用 handle 方法定义当调用命令时要执行命令逻辑

use ApheleiaCli\Argument;
use ApheleiaCli\Command;
use ApheleiaCli\Option;
use WP_CLI;

class HelloCommand extends Command
{
    public function configure(): void
    {
        $this->setName('example hello')
            ->setDescription('Prints a greeting.')
            ->addArgument(
                (new Argument('name'))
                    ->setDescription('The name of the person to greet.')
            )
            ->addOption(
                (new Option('type'))
                    ->setDescription('Whether or not to greet the person with success or error.')
                    ->setDefault('success')
                    ->setOptions('success', 'error')
            )
            ->setUsage("## EXAMPLES\n\n\twp example hello newman")
            ->setWhen('after_wp_load');
    }

    public function handle($args, $assocArgs)
    {
        [$name] = $args;

        $type = $assocArgs['type'];
        WP_CLI::$type("Hello, $name!");
    }
}

使用 CommandRegistry 注册命令。

use ApheleiaCli\CommandRegistry;

$registry = new CommandRegistry();

$registry->add(new HelloCommand());

$registry->initialize();

我们创建的命令与原始版本之间有一个显著的区别:当您运行 wp help example 时,WP-CLI 并没有为父 example 命令显示任何描述性文本。

我们可以采取几种不同的方法来解决这个问题。

第一种是在我们的 HelloCommand 旁边注册一个专用命名空间

$registry->namespace('example', 'Implements example command.');
$registry->add(new HelloCommand());

第二种是利用命令组。

首先,我们需要从我们的命令名称中删除父命令部分

class HelloCommand extends Command
{
    public function configure(): void
    {
        $this->setName('hello')
            // etc...
            ;
    }

    // ...
}

然后我们使用注册表上的 group 方法。提供给 group 方法的回调将接收一个范围注册实例,这样任何在回调中添加的命令将自动注册为 example 命令的子命令

$registry->group('example', 'Implements example command.', function (CommandRegistry $registry) {
    $registry->add(new HelloCommand());
});

也可以定义一个不扩展 Command 类的命令

$registry->add(
    (new Command())
        ->setName('hello')
        ->setDescription('Prints a greeting.')
        ->addArgument(
            (new Argument('name'))
                ->setDescription('The name of the person to greet.')
        )
        ->addOption(
            (new Option('type'))
                ->setDescription('Whether or not to greet the person with success or error.')
                ->setDefault('success')
                ->setOptions('success', 'error')
        )
        ->setUsage("## EXAMPLES\n\n\twp example hello newman")
        ->setWhen('after_wp_load')
        ->setHandler(function ($args, $assocArgs) {
            [$name] = $args;

            $type = $assocArgs['type'];
            WP_CLI::$type("Hello, $name!");
        })
);

高级用法

默认情况下,命令处理程序应该与您直接使用 WP-CLI 时的编写方式大致相同。也就是说,它们应该始终期望接收命令参数列表作为第一个参数,以及命令选项的关联数组作为第二个参数

$command->setHandler(function (array $args, array $assocArgs) {
    // ...
});

但是,命令可以通过覆盖其 handlerInvokerClass 属性来修改处理程序签名。

此软件包仅附带一个替代处理程序调用程序:PhpDiHandlerInvoker。它使用 php-di/invoker 软件包来调用命令处理程序。

在可以使用之前,您必须安装 php-di/invoker

composer require php-di/invoker

然后设置命令上的处理程序调用程序(或所有命令都从中扩展的基命令)

use ApheleiaCli\Invoker\PhpDiHandlerInvoker;

class HelloCommand extends Command
{
    protected $handlerInvokerClass = PhpDiHandlerInvoker::class;

    // ...
}

有了这个,命令处理程序现在可以通过名称请求命令参数

class HelloCommand extends Command
{
    // ...

    public function handle($name, $type)
    {
        WP_CLI::$type("Hello, $name!");
    }
}