如何在列中显示 "choice()" 的控制台提示?

How to display console prompt for "choice()" in columns?

在 Laravel 命令中,我正在寻找一种方法来在多列中显示 52 个选项,而不是在一个需要滚动的长列表中显示。

这可能吗?

这是我目前的代码:

do {
    $i++;
    $col_name[$i] = $this->ask('Column name?');
    if ($col_name[$i] != null) {
        $col_type[$i] = $this->choice('Column type?', [
            "0" => 'bigIncrements',
            "1" => 'bigInteger',
            "2" => 'binary',
            "3" => 'boolean',
            "4" => 'char',
            "5" => 'date',
            "6" => 'dateTime',
            "7" => 'dateTimeTz',
            "8" => 'decimal',
            ...
            "51" => 'uuid',
            "52" => 'year'
       ], 'string');
    }
} while ($col_name[$i] != null);

Laravel 内部使用 Symfony Console component, and specifically the SymfonyStyle and QuestionHelper classes.

因为这些目前只支持打印 "choice" 类型输入的列表,你不能让它打印 table.

您可以做的是将其混合一点,使用一种表示方式来表示选项,并使用不同的助手来获取用户输入。

也就是说,打印一个包含所有选项的 table,然后给用户一个自动完成输入以选择其中一个。

例如:

$options = [
           'bigIncrements',
           'bigInteger',
           'binary',
           'boolean',
           'char',
           'date',
           'dateTime',
           'dateTimeTz',
           'decimal',
           // ...
           'uuid',
           'year'
];

$rows    = array_chunk($options, 6);
$headers = ['Opt 1', 'Opt 2', 'Opt 3', 'Opt 4', 'Opt 5', 'Opt 6'];

$this->table($headers, $rows);

$columnType = $name = $this->anticipate('Column Type?', $options);

我使用 header 和 "Opt X" 的假 header 只是因为 Laravel 辅助方法给你的选择比直接使用 Symfony 组件少,但我想他们会做捏.