Introduction

Laravel Promptsは、プレースホルダーテキストやバリデーションを含むブラウザのような機能を備えた、美しくユーザーフレンドリーなフォームをコマンドラインアプリケーションに追加するためのPHPパッケージです。
プロンプト(Prompts) - img1
Laravel Promptsは、Artisanコンソールコマンドでユーザー入力を受け付けるのに最適ですが、任意のコマンドラインPHPプロジェクトでも使用できます。

Laravel Promptsは、macOS、Linux、およびWSLを使用したWindowsをサポートしています。詳細については、サポートされていない環境とフォールバックに関するドキュメントをご覧ください。

Installation

Laravel Promptsは、最新のLaravelリリースにすでに含まれています。

Laravel Promptsは、Composerパッケージマネージャーを使用して他のPHPプロジェクトにもインストールできます:

  1. composer require laravel/prompts

Available Prompts

Text

  1. ``````php
  2. use function Laravel\Prompts\text;
  3. $name = text('What is your name?');
  4. `

プレースホルダーテキスト、デフォルト値、および情報のヒントを含めることもできます:

  1. $name = text(
  2. label: 'What is your name?',
  3. placeholder: 'E.g. Taylor Otwell',
  4. default: $user?->name,
  5. hint: 'This will be displayed on your profile.'
  6. );

Required Values

値の入力が必要な場合は、required引数を渡すことができます:

  1. $name = text(
  2. label: 'What is your name?',
  3. required: true
  4. );

バリデーションメッセージをカスタマイズしたい場合は、文字列を渡すこともできます:

  1. $name = text(
  2. label: 'What is your name?',
  3. required: 'Your name is required.'
  4. );

Additional Validation

最後に、追加のバリデーションロジックを実行したい場合は、validate引数にクロージャを渡すことができます:

  1. $name = text(
  2. label: 'What is your name?',
  3. validate: fn (string $value) => match (true) {
  4. strlen($value) < 3 => 'The name must be at least 3 characters.',
  5. strlen($value) > 255 => 'The name must not exceed 255 characters.',
  6. default => null
  7. }
  8. );

クロージャは、入力された値を受け取り、エラーメッセージを返すか、バリデーションが成功した場合はnullを返すことができます。

また、Laravelのvalidatorの力を活用することもできます。そのためには、validate引数に属性名と希望するバリデーションルールを含む配列を提供します:

  1. $name = text(
  2. label: 'What is your name?',
  3. validate: ['name' => 'required|max:255|unique:users']
  4. );

Textarea

  1. ``````php
  2. use function Laravel\Prompts\textarea;
  3. $story = textarea('Tell me a story.');
  4. `

プレースホルダーテキスト、デフォルト値、および情報のヒントを含めることもできます:

  1. $story = textarea(
  2. label: 'Tell me a story.',
  3. placeholder: 'This is a story about...',
  4. hint: 'This will be displayed on your profile.'
  5. );

Required Values

値の入力が必要な場合は、required引数を渡すことができます:

  1. $story = textarea(
  2. label: 'Tell me a story.',
  3. required: true
  4. );

バリデーションメッセージをカスタマイズしたい場合は、文字列を渡すこともできます:

  1. $story = textarea(
  2. label: 'Tell me a story.',
  3. required: 'A story is required.'
  4. );

Additional Validation

最後に、追加のバリデーションロジックを実行したい場合は、validate引数にクロージャを渡すことができます:

  1. $story = textarea(
  2. label: 'Tell me a story.',
  3. validate: fn (string $value) => match (true) {
  4. strlen($value) < 250 => 'The story must be at least 250 characters.',
  5. strlen($value) > 10000 => 'The story must not exceed 10,000 characters.',
  6. default => null
  7. }
  8. );

クロージャは、入力された値を受け取り、エラーメッセージを返すか、バリデーションが成功した場合はnullを返すことができます。

また、Laravelのvalidatorの力を活用することもできます。そのためには、validate引数に属性名と希望するバリデーションルールを含む配列を提供します:

  1. $story = textarea(
  2. label: 'Tell me a story.',
  3. validate: ['story' => 'required|max:10000']
  4. );

Password

  1. ``````php
  2. use function Laravel\Prompts\password;
  3. $password = password('What is your password?');
  4. `

プレースホルダーテキストと情報のヒントを含めることもできます:

  1. $password = password(
  2. label: 'What is your password?',
  3. placeholder: 'password',
  4. hint: 'Minimum 8 characters.'
  5. );

Required Values

値の入力が必要な場合は、required引数を渡すことができます:

  1. $password = password(
  2. label: 'What is your password?',
  3. required: true
  4. );

バリデーションメッセージをカスタマイズしたい場合は、文字列を渡すこともできます:

  1. $password = password(
  2. label: 'What is your password?',
  3. required: 'The password is required.'
  4. );

Additional Validation

最後に、追加のバリデーションロジックを実行したい場合は、validate引数にクロージャを渡すことができます:

  1. $password = password(
  2. label: 'What is your password?',
  3. validate: fn (string $value) => match (true) {
  4. strlen($value) < 8 => 'The password must be at least 8 characters.',
  5. default => null
  6. }
  7. );

クロージャは、入力された値を受け取り、エラーメッセージを返すか、バリデーションが成功した場合はnullを返すことができます。

また、Laravelのvalidatorの力を活用することもできます。そのためには、validate引数に属性名と希望するバリデーションルールを含む配列を提供します:

  1. $password = password(
  2. label: 'What is your password?',
  3. validate: ['password' => 'min:8']
  4. );

Confirm

ユーザーに「はいまたはいいえ」の確認を求める必要がある場合は、confirm関数を使用できます。ユーザーは矢印キーを使用するか、yまたはnを押して応答を選択できます。この関数はtrueまたはfalseのいずれかを返します。

  1. use function Laravel\Prompts\confirm;
  2. $confirmed = confirm('Do you accept the terms?');

デフォルト値、カスタマイズされた「はい」と「いいえ」ラベルの文言、および情報のヒントを含めることもできます:

  1. $confirmed = confirm(
  2. label: 'Do you accept the terms?',
  3. default: false,
  4. yes: 'I accept',
  5. no: 'I decline',
  6. hint: 'The terms must be accepted to continue.'
  7. );

Requiring “Yes”

必要に応じて、required引数を渡すことでユーザーに「はい」を選択させることができます:

  1. $confirmed = confirm(
  2. label: 'Do you accept the terms?',
  3. required: true
  4. );

バリデーションメッセージをカスタマイズしたい場合は、文字列を渡すこともできます:

  1. $confirmed = confirm(
  2. label: 'Do you accept the terms?',
  3. required: 'You must accept the terms to continue.'
  4. );

Select

ユーザーに事前定義された選択肢から選択させる必要がある場合は、select関数を使用できます:

  1. use function Laravel\Prompts\select;
  2. $role = select(
  3. label: 'What role should the user have?',
  4. options: ['Member', 'Contributor', 'Owner']
  5. );

デフォルトの選択肢と情報のヒントを指定することもできます:

  1. $role = select(
  2. label: 'What role should the user have?',
  3. options: ['Member', 'Contributor', 'Owner'],
  4. default: 'Owner',
  5. hint: 'The role may be changed at any time.'
  6. );

選択されたキーがその値の代わりに返されるように、options引数に連想配列を渡すこともできます:

  1. $role = select(
  2. label: 'What role should the user have?',
  3. options: [
  4. 'member' => 'Member',
  5. 'contributor' => 'Contributor',
  6. 'owner' => 'Owner',
  7. ],
  8. default: 'owner'
  9. );

最大5つのオプションが表示され、リストがスクロールし始める前に表示されます。このカスタマイズは、scroll引数を渡すことで行えます:

  1. $role = select(
  2. label: 'Which category would you like to assign?',
  3. options: Category::pluck('name', 'id'),
  4. scroll: 10
  5. );

Additional Validation

他のプロンプト関数とは異なり、select関数はrequired引数を受け付けません。なぜなら、何も選択しないことはできないからです。ただし、選択肢を提示しながら選択を防ぐ必要がある場合は、validate引数にクロージャを渡すことができます:

  1. $role = select(
  2. label: 'What role should the user have?',
  3. options: [
  4. 'member' => 'Member',
  5. 'contributor' => 'Contributor',
  6. 'owner' => 'Owner',
  7. ],
  8. validate: fn (string $value) =>
  9. $value === 'owner' && User::where('role', 'owner')->exists()
  10. ? 'An owner already exists.'
  11. : null
  12. );
  1. <a name="multiselect"></a>
  2. ### Multi-select
  3. ユーザーが複数のオプションを選択できるようにする必要がある場合は、`````multiselect`````関数を使用できます:
  4. ``````php
  5. use function Laravel\Prompts\multiselect;
  6. $permissions = multiselect(
  7. label: 'What permissions should be assigned?',
  8. options: ['Read', 'Create', 'Update', 'Delete']
  9. );
  10. `

デフォルトの選択肢と情報のヒントを指定することもできます:

  1. use function Laravel\Prompts\multiselect;
  2. $permissions = multiselect(
  3. label: 'What permissions should be assigned?',
  4. options: ['Read', 'Create', 'Update', 'Delete'],
  5. default: ['Read', 'Create'],
  6. hint: 'Permissions may be updated at any time.'
  7. );

選択されたオプションのキーをその値の代わりに返すように、options引数に連想配列を渡すこともできます:

  1. $permissions = multiselect(
  2. label: 'What permissions should be assigned?',
  3. options: [
  4. 'read' => 'Read',
  5. 'create' => 'Create',
  6. 'update' => 'Update',
  7. 'delete' => 'Delete',
  8. ],
  9. default: ['read', 'create']
  10. );

最大5つのオプションが表示され、リストがスクロールし始める前に表示されます。このカスタマイズは、scroll引数を渡すことで行えます:

  1. $categories = multiselect(
  2. label: 'What categories should be assigned?',
  3. options: Category::pluck('name', 'id'),
  4. scroll: 10
  5. );

Requiring a Value

デフォルトでは、ユーザーは0個以上のオプションを選択できます。required引数を渡すことで、1つ以上のオプションを強制することができます:

  1. $categories = multiselect(
  2. label: 'What categories should be assigned?',
  3. options: Category::pluck('name', 'id'),
  4. required: true
  5. );

バリデーションメッセージをカスタマイズしたい場合は、required引数に文字列を提供できます:

  1. $categories = multiselect(
  2. label: 'What categories should be assigned?',
  3. options: Category::pluck('name', 'id'),
  4. required: 'You must select at least one category'
  5. );

Additional Validation

選択肢を提示しながら選択を防ぐ必要がある場合は、validate引数にクロージャを渡すことができます:

  1. $permissions = multiselect(
  2. label: 'What permissions should the user have?',
  3. options: [
  4. 'read' => 'Read',
  5. 'create' => 'Create',
  6. 'update' => 'Update',
  7. 'delete' => 'Delete',
  8. ],
  9. validate: fn (array $values) => ! in_array('read', $values)
  10. ? 'All users require the read permission.'
  11. : null
  12. );
  1. <a name="suggest"></a>
  2. ### Suggest
  3. `````suggest`````関数は、可能な選択肢の自動補完を提供するために使用できます。ユーザーは自動補完のヒントに関係なく、任意の回答を提供できます:
  4. ``````php
  5. use function Laravel\Prompts\suggest;
  6. $name = suggest('What is your name?', ['Taylor', 'Dayle']);
  7. `

また、suggest関数の第2引数としてクロージャを渡すこともできます。クロージャは、ユーザーが入力文字をタイプするたびに呼び出されます。クロージャは、ユーザーの現在の入力を含む文字列パラメータを受け取り、自動補完のためのオプションの配列を返す必要があります:

  1. $name = suggest(
  2. label: 'What is your name?',
  3. options: fn ($value) => collect(['Taylor', 'Dayle'])
  4. ->filter(fn ($name) => Str::contains($name, $value, ignoreCase: true))
  5. )

プレースホルダーテキスト、デフォルト値、および情報のヒントを含めることもできます:

  1. $name = suggest(
  2. label: 'What is your name?',
  3. options: ['Taylor', 'Dayle'],
  4. placeholder: 'E.g. Taylor',
  5. default: $user?->name,
  6. hint: 'This will be displayed on your profile.'
  7. );

Required Values

値の入力が必要な場合は、required引数を渡すことができます:

  1. $name = suggest(
  2. label: 'What is your name?',
  3. options: ['Taylor', 'Dayle'],
  4. required: true
  5. );

バリデーションメッセージをカスタマイズしたい場合は、文字列を渡すこともできます:

  1. $name = suggest(
  2. label: 'What is your name?',
  3. options: ['Taylor', 'Dayle'],
  4. required: 'Your name is required.'
  5. );

Additional Validation

最後に、追加のバリデーションロジックを実行したい場合は、validate引数にクロージャを渡すことができます:

  1. $name = suggest(
  2. label: 'What is your name?',
  3. options: ['Taylor', 'Dayle'],
  4. validate: fn (string $value) => match (true) {
  5. strlen($value) < 3 => 'The name must be at least 3 characters.',
  6. strlen($value) > 255 => 'The name must not exceed 255 characters.',
  7. default => null
  8. }
  9. );

クロージャは、入力された値を受け取り、エラーメッセージを返すか、バリデーションが成功した場合はnullを返すことができます。

また、Laravelのvalidatorの力を活用することもできます。そのためには、validate引数に属性名と希望するバリデーションルールを含む配列を提供します:

  1. $name = suggest(
  2. label: 'What is your name?',
  3. options: ['Taylor', 'Dayle'],
  4. validate: ['name' => 'required|min:3|max:255']
  5. );

ユーザーが選択するオプションが多い場合、search関数を使用すると、ユーザーは検索クエリを入力して結果をフィルタリングし、矢印キーを使用してオプションを選択できます:

  1. use function Laravel\Prompts\search;
  2. $id = search(
  3. label: 'Search for the user that should receive the mail',
  4. options: fn (string $value) => strlen($value) > 0
  5. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  6. : []
  7. );

クロージャは、ユーザーがこれまでに入力したテキストを受け取り、オプションの配列を返す必要があります。連想配列を返すと、選択されたオプションのキーが返されます。そうでない場合は、その値が返されます。

プレースホルダーテキストと情報のヒントを含めることもできます:

  1. $id = search(
  2. label: 'Search for the user that should receive the mail',
  3. placeholder: 'E.g. Taylor Otwell',
  4. options: fn (string $value) => strlen($value) > 0
  5. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  6. : [],
  7. hint: 'The user will receive an email immediately.'
  8. );

最大5つのオプションが表示され、リストがスクロールし始める前に表示されます。このカスタマイズは、scroll引数を渡すことで行えます:

  1. $id = search(
  2. label: 'Search for the user that should receive the mail',
  3. options: fn (string $value) => strlen($value) > 0
  4. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  5. : [],
  6. scroll: 10
  7. );

Additional Validation

追加のバリデーションロジックを実行したい場合は、validate引数にクロージャを渡すことができます:

  1. $id = search(
  2. label: 'Search for the user that should receive the mail',
  3. options: fn (string $value) => strlen($value) > 0
  4. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  5. : [],
  6. validate: function (int|string $value) {
  7. $user = User::findOrFail($value);
  8. if ($user->opted_out) {
  9. return 'This user has opted-out of receiving mail.';
  10. }
  11. }
  12. );
  1. <a name="multisearch"></a>
  2. ### Multi-search
  3. 検索可能なオプションが多く、ユーザーが複数のアイテムを選択できるようにする必要がある場合、`````multisearch`````関数を使用すると、ユーザーは検索クエリを入力して結果をフィルタリングし、矢印キーとスペースバーを使用してオプションを選択できます:
  4. ``````php
  5. use function Laravel\Prompts\multisearch;
  6. $ids = multisearch(
  7. 'Search for the users that should receive the mail',
  8. fn (string $value) => strlen($value) > 0
  9. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  10. : []
  11. );
  12. `

クロージャは、ユーザーがこれまでに入力したテキストを受け取り、オプションの配列を返す必要があります。連想配列を返すと、選択されたオプションのキーが返されます。そうでない場合は、その値が返されます。

プレースホルダーテキストと情報のヒントを含めることもできます:

  1. $ids = multisearch(
  2. label: 'Search for the users that should receive the mail',
  3. placeholder: 'E.g. Taylor Otwell',
  4. options: fn (string $value) => strlen($value) > 0
  5. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  6. : [],
  7. hint: 'The user will receive an email immediately.'
  8. );

最大5つのオプションが表示され、リストがスクロールし始める前に表示されます。このカスタマイズは、scroll引数を提供することで行えます:

  1. $ids = multisearch(
  2. label: 'Search for the users that should receive the mail',
  3. options: fn (string $value) => strlen($value) > 0
  4. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  5. : [],
  6. scroll: 10
  7. );

Requiring a Value

デフォルトでは、ユーザーは0個以上のオプションを選択できます。required引数を渡すことで、1つ以上のオプションを強制することができます:

  1. $ids = multisearch(
  2. label: 'Search for the users that should receive the mail',
  3. options: fn (string $value) => strlen($value) > 0
  4. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  5. : [],
  6. required: true
  7. );

バリデーションメッセージをカスタマイズしたい場合は、required引数に文字列を提供できます:

  1. $ids = multisearch(
  2. label: 'Search for the users that should receive the mail',
  3. options: fn (string $value) => strlen($value) > 0
  4. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  5. : [],
  6. required: 'You must select at least one user.'
  7. );

Additional Validation

追加のバリデーションロジックを実行したい場合は、validate引数にクロージャを渡すことができます:

  1. $ids = multisearch(
  2. label: 'Search for the users that should receive the mail',
  3. options: fn (string $value) => strlen($value) > 0
  4. ? User::whereLike('name', "%{$value}%")->pluck('name', 'id')->all()
  5. : [],
  6. validate: function (array $values) {
  7. $optedOut = User::whereLike('name', '%a%')->findMany($values);
  8. if ($optedOut->isNotEmpty()) {
  9. return $optedOut->pluck('name')->join(', ', ', and ').' have opted out.';
  10. }
  11. }
  12. );
  1. <a name="pause"></a>
  2. ### Pause
  3. `````pause`````関数は、ユーザーに情報テキストを表示し、Enter / Returnキーを押して進むことを確認するのを待つために使用できます:
  4. ``````php
  5. use function Laravel\Prompts\pause;
  6. pause('Press ENTER to continue.');
  7. `

Transforming Input Before Validation

時には、バリデーションが行われる前にプロンプト入力を変換したい場合があります。たとえば、提供された文字列から空白を削除したい場合です。これを実現するために、多くのプロンプト関数は、クロージャを受け入れるtransform引数を提供します:

  1. $name = text(
  2. label: 'What is your name?',
  3. transform: fn (string $value) => trim($value),
  4. validate: fn (string $value) => match (true) {
  5. strlen($value) < 3 => 'The name must be at least 3 characters.',
  6. strlen($value) > 255 => 'The name must not exceed 255 characters.',
  7. default => null
  8. }
  9. );

Forms

通常、追加のアクションを実行する前に情報を収集するために、順番に表示される複数のプロンプトがあります。form関数を使用して、ユーザーが完了するためのプロンプトのグループセットを作成できます:

  1. use function Laravel\Prompts\form;
  2. $responses = form()
  3. ->text('What is your name?', required: true)
  4. ->password('What is your password?', validate: ['password' => 'min:8'])
  5. ->confirm('Do you accept the terms?')
  6. ->submit();
  1. ``````php
  2. use App\Models\User;
  3. use function Laravel\Prompts\form;
  4. $responses = form()
  5. ->text('What is your name?', required: true, name: 'name')
  6. ->password(
  7. label: 'What is your password?',
  8. validate: ['password' => 'min:8'],
  9. name: 'password'
  10. )
  11. ->confirm('Do you accept the terms?')
  12. ->submit();
  13. User::create([
  14. 'name' => $responses['name'],
  15. 'password' => $responses['password'],
  16. ]);
  17. `

form関数を使用する主な利点は、ユーザーがCTRL + Uを使用してフォーム内の以前のプロンプトに戻ることができることです。これにより、ユーザーは間違いを修正したり、選択を変更したりすることができ、フォーム全体をキャンセルして再起動する必要がなくなります。

フォーム内のプロンプトに対してより詳細な制御が必要な場合は、プロンプト関数の1つを直接呼び出す代わりにaddメソッドを呼び出すことができます。addメソッドには、ユーザーが提供したすべての以前の応答が渡されます:

  1. use function Laravel\Prompts\form;
  2. use function Laravel\Prompts\outro;
  3. $responses = form()
  4. ->text('What is your name?', required: true, name: 'name')
  5. ->add(function ($responses) {
  6. return text("How old are you, {$responses['name']}?");
  7. }, name: 'age')
  8. ->submit();
  9. outro("Your name is {$responses['name']} and you are {$responses['age']} years old.");

Informational Messages

  1. ``````php
  2. use function Laravel\Prompts\info;
  3. info('Package installed successfully.');
  4. `

Tables

  1. ``````php
  2. use function Laravel\Prompts\table;
  3. table(
  4. headers: ['Name', 'Email'],
  5. rows: User::all(['name', 'email'])->toArray()
  6. );
  7. `

Spin

  1. ``````php
  2. use function Laravel\Prompts\spin;
  3. $response = spin(
  4. message: 'Fetching response...',
  5. callback: fn () => Http::get('http://example.com')
  6. );
  7. `

spin関数は、スピナーをアニメーション化するためにpcntl PHP拡張を必要とします。この拡張が利用できない場合、スピナーの静的バージョンが表示されます。

Progress Bars

長時間実行されるタスクの場合、タスクの完了度をユーザーに知らせるプログレスバーを表示することが役立ちます。progress関数を使用すると、Laravelはプログレスバーを表示し、指定された反復可能な値の各反復に対してその進行を進めます:

  1. use function Laravel\Prompts\progress;
  2. $users = progress(
  3. label: 'Updating users',
  4. steps: User::all(),
  5. callback: fn ($user) => $this->performTask($user)
  6. );
  1. コールバックは`````Laravel\Prompts\Progress`````インスタンスを受け入れることもでき、各反復でラベルとヒントを変更できます:
  2. ``````php
  3. $users = progress(
  4. label: 'Updating users',
  5. steps: User::all(),
  6. callback: function ($user, $progress) {
  7. $progress
  8. ->label("Updating {$user->name}")
  9. ->hint("Created on {$user->created_at}");
  10. return $this->performTask($user);
  11. },
  12. hint: 'This may take some time.'
  13. );
  14. `

時には、プログレスバーの進行を手動で制御する必要がある場合があります。まず、プロセスが反復する総ステップ数を定義します。次に、各アイテムを処理した後、advanceメソッドを介してプログレスバーを進めます:

  1. $progress = progress(label: 'Updating users', steps: 10);
  2. $users = User::all();
  3. $progress->start();
  4. foreach ($users as $user) {
  5. $this->performTask($user);
  6. $progress->advance();
  7. }
  8. $progress->finish();

Clearing the Terminal

  1. ``````php
  2. use function Laravel\Prompts\clear;
  3. clear();
  4. `

Terminal Considerations

Terminal Width

ラベル、オプション、またはバリデーションメッセージの長さがユーザーのターミナルの「列」の数を超えると、自動的に切り捨てられます。ユーザーが狭いターミナルを使用する可能性がある場合は、これらの文字列の長さを最小限に抑えることを検討してください。通常、安全な最大長は74文字で、80文字のターミナルをサポートします。

Terminal Height

  1. <a name="fallbacks"></a>
  2. ## Unsupported Environments and Fallbacks
  3. Laravel Promptsは、macOS、Linux、およびWSLを使用したWindowsをサポートしています。PHPのWindowsバージョンの制限により、現在WSL以外のWindowsでLaravel Promptsを使用することはできません。
  4. このため、Laravel Promptsは、[Symfony Console Question Helper](https://symfony.com/doc/7.0/components/console/helpers/questionhelper.html)などの代替実装にフォールバックすることをサポートしています。
  5. LaravelフレームワークでLaravel Promptsを使用する場合、各プロンプトのフォールバックが自動的に設定され、サポートされていない環境で自動的に有効になります。
  6. <a name="fallback-conditions"></a>
  7. #### Fallback Conditions
  8. Laravelを使用していない場合や、フォールバック動作が使用されるタイミングをカスタマイズする必要がある場合は、`````fallbackWhen`````静的メソッドにブール値を渡すことができます。`````Prompt`````クラス:
  9. ``````php
  10. use Laravel\Prompts\Prompt;
  11. Prompt::fallbackWhen(
  12. ! $input->isInteractive() || windows_os() || app()->runningUnitTests()
  13. );
  14. `

Fallback Behavior

Laravelを使用していない場合や、フォールバック動作をカスタマイズする必要がある場合は、各プロンプトクラスのfallbackUsing静的メソッドにクロージャを渡すことができます:

  1. use Laravel\Prompts\TextPrompt;
  2. use Symfony\Component\Console\Question\Question;
  3. use Symfony\Component\Console\Style\SymfonyStyle;
  4. TextPrompt::fallbackUsing(function (TextPrompt $prompt) use ($input, $output) {
  5. $question = (new Question($prompt->label, $prompt->default ?: null))
  6. ->setValidator(function ($answer) use ($prompt) {
  7. if ($prompt->required && $answer === null) {
  8. throw new \RuntimeException(
  9. is_string($prompt->required) ? $prompt->required : 'Required.'
  10. );
  11. }
  12. if ($prompt->validate) {
  13. $error = ($prompt->validate)($answer ?? '');
  14. if ($error) {
  15. throw new \RuntimeException($error);
  16. }
  17. }
  18. return $answer;
  19. });
  20. return (new SymfonyStyle($input, $output))
  21. ->askQuestion($question);
  22. });

フォールバックは、各プロンプトクラスごとに個別に設定する必要があります。クロージャは、プロンプトクラスのインスタンスを受け取り、プロンプトに適した型を返す必要があります。