9
2

More than 1 year has passed since last update.

【Laravel】特定の条件の場合のみバリデーションを行う

Posted at

はじめに

$request->validate([
    'id' => 'required|digits_between:1,5',
    'name' => 'nullable|max:20'
]);

簡単なバリデーションを実装してみました。内容は以下の通りです。

  1. idは必須であり、整数で1桁から5桁の間であること。
  2. nameはNULL許可であり、最大20字までであること。

このバリデーションの一部を特定の条件の場合のみ行いたい場合どうすればいいでしょうか。。

パターン1 : sometimesメソッドを使う

LaravelValidtorインスタンスでsometimesメソッドを使用すると、条件付きでバリデーションを行うことができます。

$validator = Validator::make($request->all(), [
    'id' => 'required|digits_between:1,5',
    'name' => 'nullable'
]);
$validator->sometimes('name', 'max:20', function ($request) {
    return in_array($request->id, [1, 2, 3, 4, 5]); 
});

sometimesメソッドには、条件付きでバリデーションするフィールド名追加するルール条件となるクロージャの3つの引数を渡します。
第3引数のクロージャがtrueの場合、第1引数のフィールドに、第2引数のルールを追加します。
上記の例では、$request->idが1〜5の場合、namemax:20のルールを追加する処理となります。

パターン2 : 三項演算子を使う

三項演算子を使って、条件がtrueの場合のみルールを追加します。

$rules = [
    'id' => [
        'required', 
        'digits_between:1,5'
    ],
    'name' => [
        'nullable', 
        in_array($request->id, [1, 2, 3, 4, 5]) ? 'max:20' : ''
    ]
];
$validator = Validator::make($request->all(), $rules);

Validator::makeの第2引数に渡すルールを作る際に、三項演算子を使います。
$request->idが1〜5の場合はmax:20を、そうでない場合は空文字を返す三項演算子を、nameのルールに追加することで、パターン1と同じ条件を作ることができました。

まとめ

場合によっては複雑な条件でバリデーションを行いたいことも良く出てくると思うので
今回のような方法も活用していきたいと思います。参考になれば幸いです。

9
2
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
9
2