duncan3dc/console

使用 symfony/console 创建命令行 PHP 应用程序

2.3.0 2024-07-29 13:25 UTC

README

使用 symfony/console 创建命令行 PHP 应用程序。
这基本上是对 symfony/console 的一个分支,它在某些方面有所不同,并增加了一些额外功能。
大多数功能在后台运行命令时很有用(例如,通过 crontab)。

release build coverage

加载命令

可以使用以下标准自动从类创建命令(这意味着你不需要在命令类中调用 setName()):

  • 文件/类必须使用驼峰命名法,并以 "Command" 结尾(文件具有 .php 扩展名)
  • 每个大写字母将被转换为小写,并前面加上一个连字符
  • 目录将表示命名空间,每个分隔符将被替换为冒号
    使用以下示例,文件 src/commands/Category/Topic/RunCommand.php 将创建一个名为 category:topic:run 的命令
$application->loadCommands("src/commands");

当然,它们仍然可以按照symfony 方式添加

输出

我们使用 league/climate 用于终端输出,同时保持对 symfony 方式 的支持。
因此,以下所有内容都是可能的

$output->blue()->out("Blue? Wow!");
$output->dump($complexArrayForCLImate);
$output->writeln("<error>I am a symfony/console error</error>");
$output->error("I am a league/climate error");

时间限制命令

命令可以限制它们运行的时长,并在达到限制时以受控方式结束。
在您的命令类内部,您可以调用 timeout() 方法,并传递命令应运行的秒数。

class LimitedCommand extends \duncan3dc\Console\Command
{
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        while (true) {
            # If the command has been running for more than 10 minutes then end now
            if ($this->timeout(60 * 10)) {
                break;
            }
        }
    {
}

可以通过在运行应用程序时传递 --no-time-limit 来覆盖此行为,这将导致 timeout() 方法始终返回 false

调用现有命令

调用现有命令的 symfony 方式可能有点冗长,步骤似乎不必要(例如,指定命令名称两次)。
runCommand() 方法提供了一种简化的方式来完成此操作(使用来自 symfony 文档的示例)

$returnCode = $this->getApplication()->runCommand("demo:greet", [
    "name"      =>  "Fabien",
    "--yell"    =>  true,
], $input, $output);

这还确保调用任何已注册的命令事件监听器,而 symfony 不这样做

命令锁定

所有命令都会自动锁定,以防止在相同的主机上同时运行相同的命令。
您可以使用 doNotLock() 方法防止特定的命令锁定

protected function configure()
{
    $this
        ->doNotLock()
        ->setDescription("This command can run as many times as it likes, whether the previous run has finished or not");
}

当命令无法运行时,它将以状态 201 退出,状态 201 表示类常量 Application::STATUS_LOCKED

Tab 补全

Tab 补全由 stecman/symfony-console-completion 提供,有关为您的应用程序设置它的说明可在该存储库的 README.md 中找到。

命名空间列表

当您在补全模式下输入命令时,查看可用命令的命名空间列表通常很有用。
例如,您可能会输入 cat 然后按 Tab 键,这将补全命名空间和命名空间分隔符

:~$ console category:

但您再次按 Tab 键时,可能会看到您不完全认识的命令列表(或子命名空间)。在这种情况下,symfony 方式是删除冒号,将光标移回到命名空间之前,并输入 list

:~$ console list category

然后在列表中确定你需要使用的命令后,你需要输入你之前输入的内容,然后输入你需要的命令

:~$ console category:

为了使这个用例更容易,我们将带有尾部冒号的命令运行方式定义为上面显示的列表命令的别名,因此你可以实际运行

:~$ console category:

这将列出所有可用的命令,然后你可以按下上箭头键从你的shell历史记录中检索相同的命令,并继续输入命令名称,这将更快

适用于企业的duncan3dc/console

作为Tidelift订阅的一部分提供

duncan3dc/console和其他数千个软件包的维护人员正在与Tidelift合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,提高代码健康,同时支付使用确切依赖项的维护人员。了解更多。