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');
}
少し可読性は悪いですが、別クラスを作らなくてすむのは便利です。