创建 Spark 命令

虽然像任何其他路由一样通过 CLI 使用控制器很方便,但您可能会发现有时需要一些不同的东西。这就是 Spark 命令的用武之地。它们是简单的类,不需要为其定义路由,这使得它们非常适合构建开发人员可以用来简化工作流程的工具,无论是处理迁移或数据库播种,检查 cronjob 状态,甚至构建您公司的自定义代码生成器。

创建新命令

您可以非常轻松地创建新的命令以在您自己的开发中使用。每个类都必须在它自己的文件中,并且必须扩展 CodeIgniter\CLI\BaseCommand,并实现 run() 方法。

为了在 CLI 命令中列出并为您的命令添加帮助功能,应使用以下属性

  • $group: 一个字符串,用于描述在列出命令时命令归入的组。例如:Database

  • $name: 用于描述命令名称的字符串。例如:make:controller

  • $description: 用于描述命令的字符串。例如:Generates a new controller file.

  • $usage: 用于描述命令用法的字符串。例如:make:controller <name> [options]

  • $arguments: 用于描述每个命令参数的字符串数组。例如:'name' => 'The controller class name.'

  • $options: 用于描述每个命令选项的字符串数组。例如:'--force' => 'Force overwrite existing file.'

帮助说明将根据上述参数自动生成。

文件位置

命令必须存储在名为 Commands 的目录中。但是,该目录必须位于 PSR-4 命名空间中,以便 自动加载器 可以找到它。这可能在 app/Commands 中,或者您用于在所有项目开发中使用命令的目录中,例如 Acme/Commands

注意

当执行命令时,完整的 CodeIgniter CLI 环境已加载,这使得可以获取环境信息、路径信息,以及使用您在创建控制器时使用的任何工具。

示例命令

让我们逐步介绍一个示例命令,该命令仅用于演示目的,其唯一功能是报告有关应用程序本身的基本信息。首先,在 **app/Commands/AppInfo.php** 中创建一个新文件。它应该包含以下代码

<?php

namespace App\Commands;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;

class AppInfo extends BaseCommand
{
    protected $group       = 'Demo';
    protected $name        = 'app:info';
    protected $description = 'Displays basic application information.';

    public function run(array $params)
    {
        // ...
    }
}

如果您运行 **list** 命令,您将在其自己的 Demo 组下看到新命令。如果您仔细观察,您应该很容易理解它是如何工作的。 $group 属性只是告诉它如何将此命令与所有其他存在的命令进行组织,告诉它在哪个标题下列出它。

$name 属性是此命令可以调用的名称。唯一的要求是它不能包含空格,并且所有字符都必须在命令行本身中有效。但是,按照惯例,命令为小写,使用冒号和命令名称本身来进一步分组命令。这有助于防止多个命令发生命名冲突。

最后一个属性, $description 是一个简短的字符串,它显示在 **list** 命令中,并应描述命令的作用。

run()

run() 方法是在运行命令时调用的方法。 $params 数组是命令名称后任何 CLI 参数的列表,供您使用。如果 CLI 字符串为

php spark foo bar baz

那么 **foo** 是命令名称,而 $params 数组将是

<?php

$params = ['bar', 'baz'];

这也可以通过 CLI 库访问,但它已经从字符串中删除了您的命令。这些参数可用于自定义脚本的行为。

我们的演示命令可能有一个类似于 run() 方法的 run() 方法

<?php

namespace App\Commands;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;

class AppInfo extends BaseCommand
{
    // ...

    public function run(array $params)
    {
        CLI::write('PHP Version: ' . CLI::color(PHP_VERSION, 'yellow'));
        CLI::write('CI Version: ' . CLI::color(\CodeIgniter\CodeIgniter::CI_VERSION, 'yellow'));
        CLI::write('APPPATH: ' . CLI::color(APPPATH, 'yellow'));
        CLI::write('SYSTEMPATH: ' . CLI::color(SYSTEMPATH, 'yellow'));
        CLI::write('ROOTPATH: ' . CLI::color(ROOTPATH, 'yellow'));
        CLI::write('Included files: ' . CLI::color(count(get_included_files()), 'yellow'));
    }
}

有关详细信息,请参阅 CLI 库 页面。

命令终止

默认情况下,命令退出时会返回成功代码 0。如果在执行命令时遇到错误,可以使用 return 语言结构在 run() 方法中返回退出代码来终止命令。

例如,return EXIT_ERROR;

这种方法可以帮助在系统级别进行调试,例如,如果命令是通过 crontab 运行的。

可以使用在 app/Config/Constants.php 文件中定义的 EXIT_* 退出代码常量。

BaseCommand

所有命令必须扩展的 BaseCommand 类包含一些有用的实用程序方法,在创建自己的命令时应该熟悉这些方法。它还提供了一个 Logger,可以在 $this->logger 中访问。

class CodeIgniter\CLI\BaseCommand
call(string $command[, array $params = []])
参数:
  • $command (string) – 要调用的另一个命令的名称。

  • $params (array) – 要提供给该命令的其他 CLI 参数。

此方法允许您在当前命令执行期间运行其他命令。

<?php

$this->call('command_one');
$this->call('command_two', $params);
showError(Throwable $e)
参数:
  • $e (Throwable) – 用于错误报告的异常。

一个方便的方法,用于在 CLI 中维护一致且清晰的错误输出

<?php

try {
    // ...
} catch (\Exception $e) {
    $this->showError($e);
}
showHelp()

一个显示命令帮助的方法:(用法、参数、描述、选项)

setPad(string $item, int $max, int $extra = 2, int $indent = 0) string
参数:
  • $item (string) – 字符串项目。

  • $max (integer) – 最大尺寸。

  • $extra (integer) – 在末尾添加多少个额外空格。

  • $indent (integer) – 缩进空格。

对我们的字符串进行填充,以便所有标题都具有相同的长度,以便很好地对齐描述

use CodeIgniter\CLI\CLI;

$length = max(array_map('strlen', array_keys($this->options)));

foreach ($this->options as $option => $description) {
    CLI::write(CLI::color($this->setPad($option, $length, 2, 2), 'green') . $description);
}
/*
 * Output will be:
 *  -n     Set migration namespace
 *  -g     Set database group
 *  --all  Set for all namespaces, will ignore (-n) option
 */
getPad($array, $pad)

自版本 4.0.5 起弃用: 请使用 CodeIgniter\CLI\BaseCommand::setPad() 代替。

参数:
  • $array (array) – $key => $value 数组。

  • $pad (integer) – 填充空格。

一个用于计算 $key => $value 数组输出的填充的方法。填充可用于在 CLI 中输出格式良好的表格。