【Laravel Prompts】使い方(suggest)

Laravel

Laravel11の公式パッケージ Prompts の使い方の記録と解説の第6回です。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

前回はピュアPHPでtextareaを実装しました。

今回はピュアPHPでsuggestを実装していきます。

基本的な使い方

suggestは、textとselectを組み合わせたような機能です。

textの入力欄に加えて、予め提案された選択肢から選択入力することも可能です。

▼基本的な使い方(src/suggest.php)

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use function Laravel\Prompts\suggest;

$name = suggest(
    'あなたの名前を入力してください。',
    [
        'ななし はらぺこ',
        'ななし とおりすがり',
        'ななし けいびいん',
    ]
);

var_dump($name);

▼実行結果

入力欄の右下にプルダウンの矢印が表示されています。

[↓]キーを押すと提案リストが表示されます。

[↓][↑]で選択して[Enter]で確定します。

※[Escape]でキャンセルできます。

選択した内容が文字列として渡されました。

選択肢へのClosure適用

「options:」にClosureを適用することで、入力に応じた処理結果を選択肢とすることができます。

▼入力値を含む提案選択肢

$name = suggest(
    'あなたの名前を入力してください。',
    fn ($value) => collect([
        'ななし はらぺこ',
        'ななし とおりすがり',
        'ななし けいびいん',
    ])->filter(
        fn ($name) => str_contains(strtoupper($name), strtoupper($value))
    ),
);

※公式ドキュメントでは「->toArray()」を付けていませんが、現時点では「TypeError」となってしまいます。

※公式には「Illuminate\Support\Collection」も受け付ける設計のようです。

※2024/04/14執筆時点で修正Pull Requestを提出中でまだマージ&リリースされていないので、配列を返すように「->toArray()」を付けています。

Fix type error in suggest with collection by macocci7 · Pull Request #134 · laravel/prompts
This PR fixes the bug below: running the code below written in the document results in TypeError. $name = suggest( 'What...

※2024/04/17にsuggestのバグ修正がv0.1.19としてリリースされました。

▼実行結果

はじめは基本的な使い方と同じ表示です。

名前を途中まで入力すると、あいまい検索でマッチした選択肢が下に表示され、選択できるようになります。

この辺は、searchと同じような動きですね。

適当に選択して確定します。

選択した内容が返されました。

プレイスホルダー、デフォルト、補足説明

▼プレイスホルダー、デフォルト、補足説明

$name = suggest(
    label: 'あなたの名前を入力してください。',
    options: fn ($value) => collect([
        'ななし はらぺこ',
        'ななし とおりすがり',
        'ななし けいびいん',
    ])->filter(
        fn ($name) => str_contains(strtoupper($name), strtoupper($value))
    )->toArray(),
    placeholder: 'へのへの もへじ',
    default: 'ななし',
    hint: 'これはプロフィールで表示されます。',
);

▼実行結果

デフォルトの「ななし」が表示され、あいまい検索結果が選択肢として表示されています。

[Back space]で全て消去すると、プレイスホルダーが表示されます。

必須設定

▼必須設定

$name = suggest(
    label: 'あなたの名前を入力してください。',
    options: fn ($value) => collect([
        'ななし はらぺこ',
        'ななし とおりすがり',
        'ななし けいびいん',
    ])->filter(
        fn ($name) => str_contains(strtoupper($name), strtoupper($value))
    )->toArray(),
    placeholder: 'へのへの もへじ',
    default: '',
    hint: 'これはプロフィールで表示されます。',
    required: '名前の入力は必須です。',
);

▼実行結果

何も入力しないで確定すると叱られます。

バリデーション

▼バリデーション

$name = suggest(
    label: 'あなたの名前を入力してください。',
    options: fn ($value) => collect([
        'ななし はらぺこ',
        'ななし とおりすがり',
        'ななし けいびいん',
    ])->filter(
        fn ($name) => str_contains(strtoupper($name), strtoupper($value))
    )->toArray(),
    placeholder: 'へのへの もへじ',
    default: '',
    hint: 'これはプロフィールで表示されます。',
    required: '名前の入力は必須です。',
    validate: fn ($value) => match (true) {
        mb_strlen($value) < 3 => '3文字以上で入力してください。',
        mb_strlen($value) > 40 => '40文字以内で入力してください。',
        default => null,
    }
);

▼実行結果

3文字未満で確定すると叱られます。

40文字を超えても叱られます。

今回は以上です。

次回はForms(form)をピュアPHPで実装していきます。

コメント

タイトルとURLをコピーしました