LoginSignup
7
1

More than 3 years have passed since last update.

Laravelでクロージャを使った自作バリデーションの作成

Posted at

Laravelのバリデーションでチェックボックスの特定の組み合わせを不可にするために、
自作バリデーションを作成してみました。
自作バリデーションはRulesを作る方法がありますが、
調べた所、バリデーションでもクロージャが使えるようでした。

簡単なサンプルを作ってみました。
まずフォームを作ります。

<h1>果物を選んで下さい。</h1>
@if ($errors->any())
    <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
    </ul>
@endif
<form action="{{ route('check') }}" method="POST">
    @csrf
    <input type="checkbox" name="fruits[]" value="apple">りんご
    <input type="checkbox" name="fruits[]" value="orange">みかん
    <input type="checkbox" name="fruits[]" value="banana">バナナ
    <input type="submit">
</form>

りんごとバナナに同時にチェックがある時にエラーにするために、
コントローラーに以下のバリデーションを追加します。
fruitsのバリデーションの1つとしてクロージャを組み込んでます。
$attributeにフォーム名、$valueにフォームの値が入り、
$failにエラーメッセージ入れて返すという形になります。

public function check(Request $request)
{
    $request->validate([
        'fruits' => [
            'required',
            function ($attribute, $value, $fail) {
                if (in_array('apple', $value) && in_array('banana', $value)) {
                    return $fail('りんごとバナナは同時に選べません。');
                }
            }
        ],
    ]);
    return view('input');
}

少し可読性は悪いですが、別クラスを作らなくてすむのは便利です。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1