命令输入/输出

class Cake\Console\ConsoleIo

CakePHP 为命令提供 ConsoleIo 对象,以便它们能够交互地读取用户输入并向用户输出信息。

命令助手

命令助手可以在任何命令中访问和使用。

// Output some data as a table.
$io->helper('Table')->output($data);

// Get a helper from a plugin.
$io->helper('Plugin.HelperName')->output($data);

你也可以获取助手的实例并调用它们上的任何公共方法。

// Get and use the Progress Helper.
$progress = $io->helper('Progress');
$progress->increment(10);
$progress->draw();

创建助手

虽然 CakePHP 附带了一些命令助手,但你可以在应用程序或插件中创建更多。例如,我们将创建一个简单的助手来生成花哨的标题。首先创建 src/Command/Helper/HeadingHelper.php 并将以下内容放入其中

<?php
namespace App\Command\Helper;

use Cake\Console\Helper;

class HeadingHelper extends Helper
{
    public function output($args)
    {
        $args += ['', '#', 3];
        $marker = str_repeat($args[1], $args[2]);
        $this->_io->out($marker . ' ' . $args[0] . ' ' . $marker);
    }
}

然后,我们可以通过调用它在我们的一个 shell 命令中使用这个新的助手

// With ### on either side
$this->helper('Heading')->output(['It works!']);

// With ~~~~ on either side
$this->helper('Heading')->output(['It works!', '~', 4]);

助手通常实现 output() 方法,该方法接受一个参数数组。但是,由于 Console 助手是普通类,因此它们可以实现采用任何形式参数的额外方法。

注意

助手也可以放在 src/Shell/Helper 中以保持向后兼容。

内置助手

表格助手

TableHelper 帮助制作格式良好的 ASCII 艺术表格。使用它非常简单

$data = [
    ['Header 1', 'Header', 'Long Header'],
    ['short', 'Longish thing', 'short'],
    ['Longer thing', 'short', 'Longest Value'],
];
$io->helper('Table')->output($data);

// Outputs
+--------------+---------------+---------------+
| Header 1     | Header        | Long Header   |
+--------------+---------------+---------------+
| short        | Longish thing | short         |
| Longer thing | short         | Longest Value |
+--------------+---------------+---------------+

你可以在表格中使用 <text-right> 格式标签来右对齐内容

$data = [
    ['Name', 'Total Price'],
    ['Cake Mix', '<text-right>1.50</text-right>'],
];
$io->helper('Table')->output($data);

// Outputs
+----------+-------------+
| Name 1   | Total Price |
+----------+-------------+
| Cake Mix |        1.50 |
+----------+-------------+

进度助手

ProgressHelper 可以用两种不同的方式使用。简单模式允许你提供一个回调函数,该函数在进度完成之前一直被调用

$io->helper('Progress')->output(['callback' => function ($progress) {
    // Do work here.
    $progress->increment(20);
    $progress->draw();
}]);

你可以通过提供其他选项来更详细地控制进度条

  • total 进度条中项目的总数。默认为 100。

  • width 进度条的宽度。默认为 80。

  • callback 将在循环中被调用的回调函数,用于推进进度条。

所有选项使用的示例将是

$io->helper('Progress')->output([
    'total' => 10,
    'width' => 20,
    'callback' => function ($progress) {
        $progress->increment(2);
        $progress->draw();
    }
]);

进度助手也可以手动使用,以便根据需要递增和重新渲染进度条

$progress = $io->helper('Progress');
$progress->init([
    'total' => 10,
    'width' => 20,
]);

$progress->increment(4);
$progress->draw();

获取用户输入

Cake\Console\ConsoleIo::ask($question, $choices = null, $default = null)

在构建交互式控制台应用程序时,你需要获取用户输入。CakePHP 提供了一种方法来做到这一点

// Get arbitrary text from the user.
$color = $io->ask('What color do you like?');

// Get a choice from the user.
$selection = $io->askChoice('Red or Green?', ['R', 'G'], 'R');

选择验证不区分大小写。

创建文件

Cake\Console\ConsoleIo::createFile($path, $contents)

创建文件通常是许多控制台命令的重要组成部分,这些命令有助于自动执行开发和部署。 createFile() 方法为你提供了一个简单的接口,用于使用交互式确认创建文件

// Create a file with confirmation on overwrite
$io->createFile('bower.json', $stuff);

// Force overwriting without asking
$io->createFile('bower.json', $stuff, true);

创建输出

写入 stdoutstderr 是 CakePHP 中的另一个常见操作

// Write to stdout
$io->out('Normal message');

// Write to stderr
$io->err('Error message');

除了普通输出方法之外,CakePHP 还提供包装方法,这些方法使用适当的 ANSI 颜色对输出进行样式化

// Green text on stdout
$io->success('Success message');

// Cyan text on stdout
$io->info('Informational text');

// Blue text on stdout
$io->comment('Additional context');

// Red text on stderr
$io->error('Error text');

// Yellow text on stderr
$io->warning('Warning text');

如果 posix_isatty 返回 true,或者如果设置了 NO_COLOR 环境变量,则颜色格式将自动禁用。

ConsoleIo 提供了两种关于输出级别的便捷方法

// Would only appear when verbose output is enabled (-v)
$io->verbose('Verbose message');

// Would appear at all levels.
$io->quiet('Quiet message');

你也可以创建空白行或绘制虚线

// Output 2 newlines
$io->out($io->nl(2));

// Draw a horizontal line
$io->hr();

最后,你可以在屏幕上更新当前行文本

$io->out('Counting down');
$io->out('10', 0);
for ($i = 9; $i > 0; $i--) {
    sleep(1);
    $io->overwrite($i, 0, 2);
}

注意

重要的是要记住,一旦输出新行,你便无法覆盖文本。

输出级别

控制台应用程序通常需要不同级别的详细程度。例如,当以 cron 作业运行时,大多数输出都是不必要的。你可以使用输出级别来适当地标记输出。shell 的用户然后可以通过在调用命令时设置正确的标志来决定他们感兴趣的详细程度。有 3 个级别

  • QUIET - 只有绝对重要的信息应该被标记为静默输出。

  • NORMAL - 默认级别,以及正常使用。

  • VERBOSE - 将那些可能过于嘈杂而无法在日常使用中显示,但对调试有用的消息标记为 VERBOSE

你可以按照以下方式标记输出

// Would appear at all levels.
$io->out('Quiet message', 1, ConsoleIo::QUIET);
$io->quiet('Quiet message');

// Would not appear when quiet output is toggled.
$io->out('normal message', 1, ConsoleIo::NORMAL);
$io->out('loud message', 1, ConsoleIo::VERBOSE);
$io->verbose('Verbose output');

// Would only appear when verbose output is enabled.
$io->out('extra message', 1, ConsoleIo::VERBOSE);
$io->verbose('Verbose output');

你可以通过使用 --quiet--verbose 选项来控制命令的输出级别。这些选项默认情况下被添加,并且允许你一致地控制 CakePHP 命令中的输出级别。

--quiet--verbose 选项还控制日志数据如何输出到 stdout/stderr。通常,信息和更高级别的日志消息输出到 stdout/stderr。当使用 --verbose 时,调试日志将输出到 stdout。当使用 --quiet 时,只有警告和更高级别的日志消息将输出到 stderr。

样式输出

样式输出是通过在输出中包含标签来完成的 - 就像 HTML 一样 - 这些标签将被替换为正确的 ansi 代码序列,或者如果你的控制台不支持 ansi 代码则会被剥离。有几个内置样式,你也可以创建更多。内置样式是

  • success 成功消息。绿色文本。

  • error 错误消息。红色文本。

  • warning 警告消息。黄色文本。

  • info 信息消息。青色文本。

  • comment 附加文本。蓝色文本。

  • question shell 自动添加的提问文本。

  • info.bg 白色背景,青色文本。

  • warning.bg 黄色背景,黑色文本。

  • error.bg 红色背景,黑色文本。

  • success.bg 绿色背景,黑色文本。

你可以使用 $io->setStyle() 创建额外的样式。要声明一个新的输出样式,你可以这样做

$io->setStyle('flashy', ['text' => 'magenta', 'blink' => true]);

这样,你就可以在 shell 输出中使用 <flashy> 标签,如果启用 ansi 颜色,则以下内容将被渲染为闪烁的洋红色文本 $this->out('<flashy>Whoooa</flashy> Something went wrong');。在定义样式时,你可以使用以下颜色作为 textbackground 属性

  • 黑色

  • 蓝色

  • 青色

  • 绿色

  • 洋红色

  • 红色

  • 白色

  • 黄色

你也可以使用以下选项作为布尔开关,将其设置为真值即可启用它们。

  • 闪烁

  • 粗体

  • 反转

  • 下划线

添加样式后,它将对所有 ConsoleOutput 实例生效,因此您无需为 stdout 和 stderr 对象分别重新声明样式。

版本 5.1.0 中更改: 添加了 info.bgwarning.bgerror.bgsuccess.bg

关闭着色

尽管着色很漂亮,但有时您可能希望将其关闭,或强制打开。

$io->outputAs(ConsoleOutput::RAW);

以上操作将使输出对象进入原始输出模式。在原始输出模式下,不会进行任何样式处理。您可以使用三种模式。

  • ConsoleOutput::COLOR - 输出带颜色转义代码。

  • ConsoleOutput::PLAIN - 纯文本输出,已知样式标签将从输出中删除。

  • ConsoleOutput::RAW - 原始输出,不会进行任何样式或格式化。如果您要输出 XML 或调试为什么您的样式不起作用,这是一个很好的模式。

默认情况下,在 *nix 系统上,ConsoleOutput 对象默认使用彩色输出。在 Windows 系统上,除非存在 ANSICON 环境变量,否则默认使用纯文本输出。