ssnepenthe / apheleia-cli
编写 WP-CLI 命令的替代语法
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
- php-di/invoker: ^2.3
- php-stubs/wp-cli-stubs: ^2.6
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.22
- wp-cli/wp-cli: ^2.6
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!"); } }