🧍

laravel で相関バリデーションをシンプルに実装

2023/12/08に公開

はじめに

フォーム等の入力があるシステムでは、必ず実装しなければならないバリデーション処理。
Laravel では、標準で便利なバリデーションルールが定義されています。しかし、シンプルなチェックであれば実装は容易ですが、フォームが少し複雑になると、どのように実装するか悩むことも多いのではないでしょうか?

今回は Laravel で相関バリデーション(あるフィールドのバリデーションが他のフィールドの値に依存する)を実装する方法を解説します。

環境

  • PHP 8.2.3
  • Laravel 10.29.0

実装例

  • type というフィールドが A の場合、input_a フィールドは必須とする。
  • type というフィールドが B の場合、input_b フィールドは必須とする。

上記のようなルールの場合下記のような実装になります

public function rules(): array
{
    return [
        'type' => ['required', 'in:A,B,C'],
        'input_a' => ['required_if:type,A'],
        'input_b' => ['required_if:type,B']
    ];
}

また required_if を設定しつつ、更にルールを追加する事もできます。

public function rules(): array
{
    return [
        'type' => ['required', 'in:A,B,C'],
        'input_a' => ['required_if:type,A', 'nullable', 'numeric'],
        'input_b' => ['required_if:type,B', 'nullable', 'numeric']
    ];
}

numericルールを追加しました。

ここで重要なのは、nullableルールも同時に追加する必要がある点です。
nullableを追加しない場合、numericルールが有効化され、typeフィールドの値にかかわらず、入力は必須となり、さらにその値が数値でなければチェックを通過できません。

まとめ

元々相関バリデーションの実装時は条件分岐で適応させるルールを切り替えていたのですがrequired_ifを使うことで記述が非常にシンプルになりました。
今回紹介したrequired_ifの他にもrequired_unlessrequired_withrequired_without など、様々な条件付きバリデーションルールが用意されています。
用途に応じて使い分けて行きましょう!

BABYJOB テックブログ

Discussion