Laravel11の公式パッケージ Prompts の使い方の記録と解説の第7回です。
前回はピュアPHPでsuggestを実装しました。
今回は、ピュアPHPでForms(form)を実装していきます。
2024/04/17(日本時間)にリリースされたPrompts(v0.1.19)で実装された新機能です。
Laravel Prompts Forms とは
Laravel News (2024/04/18) の抜粋を引用すると
Luke Downing contributed form prompts, which are a grouped set of prompts for the user to complete. Forms include the ability to return to previous prompts and make changes without having to cancel the command and start over:
Reversible Forms in Prompts
▼自動翻訳
Luke Downing は、ユーザーが入力するためのプロンプトをグループ化したセットであるフォーム プロンプトを提供しました。フォームには、コマンドをキャンセルして最初からやり直すことなく、前のプロンプトに戻って変更を加える機能が含まれています。
具体的には使ってみるとわかると思います。
基本的な使い方
▼PHPコード(src/forms.php)
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use function Laravel\Prompts\form;
$responses = form()
->text('あなたの名前を入力してください。')
->password('パスワードを入力してください。')
->confirm('利用規約に同意しますか?')
->submit();
var_dump($responses);
「form()」にメソッドチェーンを続けて各プロンプトを記述し、
「->submit()」メソッドで締め括ります。
▼実行結果
text、password、confirmの各プロンプトが順次表示されるので、それぞれ入力・確定してみます。
各入力した結果が「$responses」に、
数値インデックスの配列として順に格納されていることが判ります。
各入力への名前付与
各入力への名前を割り当て、ハッシュとして結果を格納することができます。
各プロンプトで引数「name」を指定します。
▼PHPコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use function Laravel\Prompts\form;
$responses = form()
->text(
label: 'あなたの名前を入力してください。',
required: '名前の入力は必須です。',
name: 'name',
)->password(
label: 'パスワードを入力してください。',
validate: fn (string $value) => strlen($value) < 8
? '8文字以上で入力してください。'
: null,
name: 'passsword',
)->confirm(
label: '利用規約に同意しますか?',
required: '利用規約への同意は必須です。',
name: 'agreement',
)->submit();
var_dump($responses);
▼実行結果
各プロンプトの入力結果がハッシュに格納されています。
Formsを使うメリット
入力中に [Ctrl] + [U] を押すことで、直前のプロンプトに戻ることができます。
例えば、上記のPHPコードを実行して、
パスワード入力欄の入力待ち中に [Ctrl] + [U] を押すと、
名前の入力欄が再表示されて入力待ちになります。
前回入力した内容は保持されています。
が、passwordの入力は例外として保持されません。
当然、最初のプロンプトで [Ctrl] + [U] を押しても、
その前のプロンプトには戻りません。
「This cannot be reverted.(これは戻せません。)」と叱られます。
[Ctrl] + [C] で強制終了することができます。
add()メソッド
入力途中でより詳細な制御が必要な場合には、
「add()」メソッドを使用することができます。
「add()」メソッドには、直前までに入力された全ての値が渡されます。
▼PHPコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use function Laravel\Prompts\form;
use function Laravel\Prompts\text;
use function Laravel\Prompts\outro;
$responses = form()
->text(
'あたなの名前を入力してください。',
required: '名前の入力は必須です。',
name: 'name'
)->add(function ($responses) {
return text(
label: "{$responses['name']}さんの年齢を入力してください。",
hint: "半角数字で入力してください。",
validate: fn (string $value) => !preg_match('/^[0-9]+$/', $value)
? '半角数字で入力してください。'
: null
);
}, name: 'age')
->submit();
outro("あなたは「{$responses['name']}」さん({$responses['age']}歳)ですね。");
▼実行結果
年齢の入力欄で、直前に入力された名前を参照しています。
今回は以上です。
コメント