画像と名前などがセットとなって、配列で複数送られて来る場合。
// イメージ $_POST['img'] = [ 0 => [ 'name' => 'あいうえお', 'file' => 画像ファイルデータ_0 ], 1 => [ 'name' => 'かきくけこ', 'file' => 画像ファイルデータ_1 ], ];
最低1枚は画像が選択されているように、バリデーションを行いたくても、以下の指定では名前だけ入力されていた場合、必須チェックをスルーしてしまいます。
return [ 'img' => 'required:array', ],
その場合、以下のように withValidator を使うことで解決できました。
public function rules() { return [ 'img.*.name' => [ 'required_with:img.*.file', 'string', 'max:50', ], 'img.*.file' => [ 'file', 'image', 'mimes:jpeg,jpg,png,gif', 'max_mb:10', ], ]; } public function withValidator($validator) { $validator->after(function ($validator) { $file_count = 0; foreach ($this->file('img') as $key => $img) { if (isset($img['file']) && is_uploaded_file($img['file'])) { $file_count ++; } } if ($file_count === 0) { $validator->errors()->add('img', '画像は必須です。'); } }); }
コメント