画像と名前などがセットとなって、配列で複数送られて来る場合。
// イメージ
$_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', '画像は必須です。');
}
});
}
コメント