はじめに
$request->validate([
'id' => 'required|digits_between:1,5',
'name' => 'nullable|max:20'
]);
簡単なバリデーションを実装してみました。内容は以下の通りです。
-
id
は必須であり、整数で1桁から5桁の間であること。 -
name
はNULL許可であり、最大20字までであること。
このバリデーションの一部を特定の条件の場合のみ行いたい場合どうすればいいでしょうか。。
パターン1 : sometimesメソッドを使う
Laravel
のValidtor
インスタンスで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の場合、name
にmax: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と同じ条件を作ることができました。
まとめ
場合によっては複雑な条件でバリデーションを行いたいことも良く出てくると思うので
今回のような方法も活用していきたいと思います。参考になれば幸いです。