zn12
@zn12 (a j)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

複数画像のバリデーション

解決したいこと

Laravel6でレシピ投稿アプリを作成しています。
料理の手順を説明するための画像を複数投稿できる仕様になっており、それぞれに入力必須のバリデーションをかけたいです。

発生している問題

inputのname属性が配列となっており、ドット記法を用いてすべての配列を指定できるという認識でバリデーションを設定しましたが機能しませんでした。
以下コードになります。

FormRequestファイル

CreateRecipe.php
public function rules()
  {
    return [
        'upload_image.cooking_image.*' => 'required|image|mimes:jpeg,png,jpg',
    ];
  }

bladeファイル

create.php
<input type="file" name="upload_image[cooking_image][]" class="howto-image" style="display:none" accept="image/*">

※JavaScriptで動的にフォーム入力欄が追加できる仕様となっております。

自分で試したこと

rules内のname属性を以下に変えてみると挙動が変わりました。

'upload_image.cooking_image.*'  // バリデーションが機能せず素通りしてしまう。

'upload_image.cooking_image'  // 画像をアップロードしてもファイルを要求され、バリデーションがかかってしまう。

'upload_image.*' // 同上 

'upload_image'   // 同上

しかし、それぞれの画像ファイル選択欄にバリデーションをかけることができませんでした。

実現したいこと


// JavaScriptで動的に追加したフォーム入力欄それぞれに、以下のようなバリデーションをかけたいです。

upload_image[cooking_image][0]  →画像選択必須
upload_image[cooking_image][1]  →画像選択必須
upload_image[cooking_image][2]  →画像選択必須
upload_image[cooking_image][3]  →画像選択必須
            ⁝

よろしくお願い致します。

2022/9/23 追記

name属性の配列で自動で割り振られる連番の部分を指定するとバリデーションをかけることができました。
しかし、「.*」で動的に追加されたフォーム欄すべてにバリデーションをかけることができません。

FormRequestファイル

CreateRecipe.php
public function rules()
  {
    return [
        'upload_image.cooking_image.0' => 'required|image|mimes:jpeg,png,jpg',
        'upload_image.cooking_image.1' => 'required|image|mimes:jpeg,png,jpg',
        'upload_image.cooking_image.2' => 'required|image|mimes:jpeg,png,jpg',
    ];
  }
// 上記のようにname属性を個別に指定するとバリデーションをかけることができます。
// しかし、『'upload_image.cooking_image.*'』と配列のすべてを指定するとバリデーションが機能しません。

0

2Answer

ドット記法を用いてすべての配列を指定できるという認識

この認識は勘とかでしょうか?

0Like

Comments

  1. なるほど、どの部分の記載でしょうか?
  2. FormRequestで実現できるかは分からないのですが、Controllerで動的にバリデーションを組み立てることは出来ないでしょうか
  3. @zn12

    Questioner

    「* (ワイルドカード)」で upload_image[cooking_image][] の動的に変化する[]部分(index)がすべて拾ってこれるのでないかと考えました。

    Controllerで実装することも考えましたが、コードが見にくくなるのではないかと思いバリデーションの機能はFormRequestにしました。

自己解決しました。

name属性が配列となっている為、以下のバリデーションに変えるとうまくいきました。

 return [
      'upload_image.cooking_image.*' => 'required|image|mimes:jpeg,png,jpg',
      'upload_image.cooking_image' => 'required|array|min:1', 
      'upload_image' => 'required|array|min:1', 
 ];

0Like

Your answer might help someone💌