2026/01/27に新しいnumber関数がmainブランチにマージされました。執筆時点(2026/01/27)での最新リリース v0.3.10 には含まれていません。次のリリースに含まれると思われます。
number関数は数値入力用のプロンプトです。矢印キーでの数値増減や、増減幅の設定、最大・最小へのclamp、入力値の自動バリデーション等をサポートしています。
プルリクの内容
Promptsで数字のフィールドがあるCLIを作成するとき、私は直感的に上下矢印を使って、HTMLの数字入力と同じように値を変えます。このPRは、以下の機能を持つ新しい number ヘルパーを導入します:
🔵値が数値であることを自動的に検証します
🔵最小値・最大値が提供された場合、値を自動でクランプします
🔵ユーザーが step を指定することを許容します(デフォルトは1)
🔵オプションが利用できない場合に矢印で値変更できる視覚的なインジケーターがあります
🔵数値バリデーション完了後に提供されたバリデーションに切り替えます
🔵入力された値は int に変換されます数値以外の入力をすべて抑制しようかと考えましたが、それはやりすぎだと思いました。
リポジトリをクローンしていじってみる
執筆時点(2026/01/27)ではまだリリースされていない機能なので、
リポジトリをクローンしていじってみることにします。
git clone https://github.com/laravel/prompts.git using-laravel-prompts-number

リポジトリ内に移動してから、依存関係をインストールします。
cd using-laravel-prompts-number
composer install

number関数の使用例として「playground/number.php」が新設されています。
▼「playground/number.php」
<?php
use function Laravel\Prompts\number;
require __DIR__.'/../vendor/autoload.php';
$value = number(
label: 'How many items do you want to buy?',
placeholder: 'E.g. 10',
validate: fn ($value) => match (true) {
$value !== 6 => 'Actually you have to buy 6 items.',
default => null,
},
hint: 'You can buy up to 10 items.',
min: 1,
max: 10,
);
var_dump($value, gettype($value));
echo str_repeat(PHP_EOL, 5);
▼実行結果
入力欄の右端にインジケーター「▲▼」が表示されています。
上下矢印キー「↑↓」を押すと、入力欄の数値が増減します。
数値は、min/maxの値の範囲で増減します。
数値以外の入力はバリデーションで警告されます。
validate引数に指定しているチェックにより、数値が6でないと警告されます。
数値を6にして入力確定すると、入力された数値は int型に変換されて返されます。
関数定義を確認してみる
▼「src/helpers.php」抜粋(PSR-12に則って整形)
if (! function_exists('\Laravel\Prompts\number')) {
/**
* Prompt the user for number input.
*/
function number(
string $label,
string $placeholder = '',
string $default = '',
bool|string $required = false,
mixed $validate = null,
string $hint = '',
?int $min = null,
?int $max = null,
?int $step = null,
): int|string {
return (new NumberPrompt(...get_defined_vars()))->prompt();
}
}
min/max/stepの定義が int なので、整数のみを扱う関数であることが判ります。
筆者的には「少数はダメなのかい?」と思ってしまいましたが。。
倍率「1.5」とかできないじゃん。
少数を扱うとなると桁の管理が面倒だから整数のみにしたのかもね。
因みに、min/maxの引数を省略すると、PHP_INT_MIN/PHP_INT_MAXが適用されます。
▼「src/NumberPrompt.php」抜粋
public function __construct(
public string $label,
public string $placeholder = '',
public string $default = '',
public bool|string $required = false,
public mixed $validate = null,
public string $hint = '',
public ?Closure $transform = null,
public ?int $min = null,
public ?int $max = null,
public ?int $step = null,
) {
$this->trackTypedValue($default);
$this->step = max(1, $this->step ?? 1);
$this->min ??= PHP_INT_MIN;
$this->max ??= PHP_INT_MAX;
$originalValidate = $this->validate;
$this->validate = function ($value) use ($originalValidate) {
if ($value !== '' && ! is_numeric($value)) {
return 'Must be a number';
}
if (is_numeric($value)) {
if ($value < $this->min) {
return 'Must be at least '.$this->min;
}
if ($value > $this->max) {
return 'Must be less than '.$this->max;
}
}
if ($originalValidate) {
return ($originalValidate)($value);
}
return null;
};
$this->on('key', function (string $key) {
match ($key) {
Key::UP, Key::UP_ARROW => $this->increaseValue(),
Key::DOWN, Key::DOWN_ARROW => $this->decreaseValue(),
default => null,
};
});
}
maxを指定しないで、未入力の状態から↓矢印キーを押下すると、PHP_INT_MAXが入力されます。
minを指定しないで、未入力の状態から↑矢印キーを押下すると、PHP_INT_MINが代入されます。
色々といじってみたところ、少数点入力をすると挙動が怪しくなります。。
この辺はissueものかも知れません。
- 0
- 0
- 0
- 0

コメント