netesy/console

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

1.4.3 2020-04-06 23:57 UTC

This package is auto-updated.

Last update: 2024-09-07 10:24:34 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 退出,状态由类常量 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合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,提高代码质量,同时支付您使用的确切依赖项的维护者。了解更多。