はじめに
Laravel Prompts は、コマンドラインアプリケーションに美しく使いやすい対話型フォームを追加するためのPHPパッケージです。 プレースホルダーテキストやバリデーションといったブラウザのフォームに近い体験を提供します。 Artisanコマンドのコード内で直接呼び出せるため、ユーザーへの問い合わせをシンプルかつ直感的に記述できます。Laravel PromptsはmacOS・Linux・Windows(WSL)をサポートしています。
非対応環境では自動的にフォールバック動作に切り替わります。
インストール
Laravel PromptsはLaravel本体に同梱されているため、追加インストールは不要です。 他のPHPプロジェクトで使いたい場合はComposerでインストールします。基本的なプロンプト関数
text — テキスト入力
text() でユーザーに文字列入力を求めます。
required を指定すると入力を必須にできます。バリデーションメッセージも変更可能です。
validate クロージャで追加のバリデーションを行えます。エラーメッセージを返すか、合格時に null を返します。
textarea — 複数行テキスト入力
textarea() で複数行の入力を受け付けます。
number — 数値入力
number() で数値を受け付けます。上下矢印キーで値を増減できます。
password — パスワード入力
password() はテキスト入力と同様ですが、入力内容が画面に表示されません。
confirm — Yes/No確認
confirm() でユーザーに二択の確認を求めます。true または false を返します。
select — 選択リスト
select() でユーザーに一覧から1つ選ばせます。
scroll でスクロール前に表示する選択肢数を変更できます(デフォルト5件)。
multiselect — 複数選択
multiselect() で複数の選択肢を同時に選ばせます。
required を指定すると少なくとも1つの選択を必須にできます。
suggest — オートコンプリート付き入力
suggest() は候補を提示しながら自由入力も受け付けます。
search — 動的検索
search() は入力するたびに候補リストを更新します。クロージャが返す配列が候補になります。
multisearch — 動的複数選択
multisearch() は動的検索で複数選択ができます。
pause — 一時停止
pause() でユーザーにEnterキーの押下を促して処理を一時停止できます。
autocomplete — インライン補完
autocomplete() はゴーストテキストとして候補を表示するインライン補完関数です。suggest() と異なり、ユーザーが入力するたびに一致する候補がゴーストテキストとして表示され、Tab キーまたは右矢印キーで補完を確定できます。
バリデーション
すべてのプロンプト関数はvalidate 引数でバリデーションを設定できます。
null を返すとバリデーション成功です。
Laravelのバリデーションルールを配列形式で使うこともできます。
transform 引数を使います。
フォーム
form() を使うと複数のプロンプトをひとまとめにして、完了前にまとめてキャンセルすることができます。
情報出力
テキストメッセージをスタイル付きで出力する関数が用意されています。コールアウト
callout() はラベルとコンテンツを枠で囲んで表示します。デプロイサマリー・エラー詳細・ステータス更新など、重要な情報を目立たせるのに適しています。
type 引数に 'warning' または 'error' を指定すると、ビジュアルスタイルを変更できます。
info 引数でフッター行を追加できます。IDやタイムスタンプなどのメタデータ表示に便利です。
リッチコンテンツ
文字列の代わりに配列を渡すと、構造化されたリッチなコールアウトを作れます。Element クラスには見出し・箇条書きリスト・番号付きリスト・キーバリューリスト・リンクを作るファクトリーメソッドがあります。
Element::keyValueList でラベル付きデータを表示できます。
Element::link は OSC 8 に対応したターミナルでクリック可能なハイパーリンクを生成します。URL のみ、または URL とカスタムラベルを渡せます。
テーブル表示
table() でデータをテーブル形式で表示できます。
スピン(ローディング表示)
spin() はクロージャの実行中にローディングインジケーターを表示します。
進捗バー
progress() で繰り返し処理の進捗を視覚的に表示できます。
タスク
task() はコールバック実行中にスピナーとスクロール可能なライブ出力エリアを表示します。依存関係のインストールやデプロイスクリプトなど長時間実行するプロセスをラップするのに最適で、何が起きているかリアルタイムで確認できます。
Logger インスタンスを受け取り、ログ行やステータスメッセージをリアルタイムで表示できます。
ログ行の出力
line メソッドでスクロール出力エリアに1行ずつログを書き込みます。
ステータスメッセージ
success・warning・error を使うと、スクロールログエリアの上部に固定されたハイライト付きメッセージを表示できます。
ラベルの更新
label メソッドで実行中にタスクのラベルを更新できます。subLabel メソッドはラベルの下に薄く表示されるサブラベルを設定します。空文字列を渡すとサブラベルを消去できます。subLabel 引数で初期サブラベルを指定することもできます。
テキストのストリーミング
AIが生成するレスポンスのように段階的に出力が生成される処理では、partial メソッドでテキストをひとつひとつストリーミングできます。ストリームが完了したら commitPartial を呼んで確定します。
出力上限とサマリーの保持
デフォルトでは最大10行のスクロール出力を表示します。limit 引数でカスタマイズできます。タスク完了後もステータスメッセージを画面に残したい場合は keepSummary: true を渡します。
ストリーム
stream() はテキストを段階的にターミナルに表示します。AIが生成するコンテンツやチャンクで届くデータの表示に最適です。
append メソッドはフェードインエフェクトでテキストをストリームに追加します。すべてのコンテンツをストリームし終えたら close を呼んで出力を確定しカーソルを復元します。
ターミナル操作
ターミナルタイトルの設定
ターミナルのクリア
ターミナルの考慮事項
ターミナル幅: ラベル・選択肢・バリデーションメッセージがターミナルの列数を超える場合、自動的に切り詰められます。80列のターミナルを想定する場合、最大74文字を目安にしてください。 ターミナルの高さ:scroll 引数を受け付けるプロンプトでは、バリデーションメッセージ用のスペースを含めてターミナルの高さに収まるよう自動的に値が調整されます。
フォールバック
非対応の環境(Windows non-WSLなど)では自動的にフォールバックします。 デフォルトではLaravelの$this->ask() や $this->choice() などの組み込みメソッドが代わりに使われます。
テスト
Laravel PromptsはPestやPHPUnitのテストと連携できます。関連ページ
Artisanコンソール
Artisanコマンド内でPromptsを活用する