二つの配列パラメータ数が同じバリデーションを追加したい。
一カ所だけでしか使わないからフォームリクエストを使うほどでもない。
どういうことかというとこんなかんじ。
// OK
test.php?name[]=100&value[]=980
test.php?name[]=100&value[]=980&name[]=200&value[]=2000
test.php?name[1]=100&value[1]=980
// NG
test.php?name[]=100&value[]=980&name[]=200
test.php?name[]=100&value[]=980&value[]=2000
test.php?name[1]=100&value[2]=980
たとえば商品IDと個数、みたいなセットで送る必要のあるパラメータに使いたい。
その場合はitems[商品ID]=個数
とかのほうがいいだろうけど、3点以上のパラメータが必要だとか、色々とそうもいかないことがあるわけですよ。
コントローラ
// バリデータ
$validation = [
'name' => 'required|array',
'name.*' => 'required|integer',
'value' => 'required|array',
'value.*' => 'required|integer',
];
$v = Validator::make($request->all(), $validation);
// パラメータ数が同じバリデーション
$v->after(function ($validator) {
$data = $validator->getData();
if (!isset($data['name']) || !isset($data['value'])
|| !is_array($data['name']) || !is_array($data['value'])
|| array_keys($data['name']) !== array_keys($data['value'])
) {
$validator->errors()->add('name', 'nameとvalueの個数は同じでないといけない');
}
});
// バリデーション実行
if ($v->fails()) {
return 'えらー';
}
なんだこれ。
目的は達成しているのですがコードがとても微妙。
name
やname.*
などのバリデーションに成功しても失敗しても必ずafter
は呼ばれます。
すなわち当初の$validation
と同等の事前チェックをafter
にも再度書かないといけません。
だからといってチェック後の値を取得しようと$validator->getData()
を$validator->validated()
にしたら無限ループで死にます。
あと試しに$validator->fails()
ってしてみたらApacheごと死んだ。何故。
このあたりもうちょっとうまい書き方はないものだろうか。
おそらくあるんだろうけどよくわかりませんでした。