質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.54%

laravelのバリデーション時にエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 227

k3114

score 2

発生しているエラー・問題

画像投稿時に以下のエラーが発生

Illuminate\Validation\Validator::validateO}moeble does not exist.

現在状況

バリデーションの設定を行い、nullでも通るようにするためフォームリクエストを作成したが
画像投稿時にエラーが発生してしまう。(nullの場合は正常に通過)
また、(LostRequest $request) を(Request $request)に戻した際は正常に通過できる

現在のコード

public function upload(LostRequest $request) {

        $lost = new Lost;
        $lost->user_id = $request->user()->id;
        $lost->pref    = $request->pref;
        $lost->seed    = $request->seed;
        $lost->image = empty($request->image) !== false ? '' :$request->image->getClientOriginalName(); // アップロードされたファイル名のままテーブルに保存
        $lost->body    = $request->body;
        $lost->save();


        //画像がなければ下記処理のスキップ
        if (empty($request->image) == false) {  
            if ($request->file('image')->isValid([])) {
                $file_name = $request->file('image')->getClientOriginalName(); // アップロードされたファイル名の取得
                $path = $request->image->storeAs('public',$file_name);
                return view('home')->with('filename', basename($path));
            } else {
                return redirect()
                    ->back()
                    ->withInput()
                    ->withErrors();
            }
        }
        return view('home');
    }
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'seed'  => 'required',
            'pref'  => 'required',
            'image' => 'nullable|file|image|mime:jpg,jpeg,png',
            'body'  => 'nullable',
        ];
    }
}
<form action="/size" method="POST" enctype="multipart/form-data">

        <!-- アップロードした画像。なければ表示しない -->
        @isset ($filename)
        <div>
            <img src="{{ asset('storage/' . $filename) }}">
        </div>
        @endisset

        <div class='select_seed'>
            @yield('seed_list')
        </div>
        <div class='form-data'>
          <div class="pref">


          </div>
        </div>

        <div class='form_datas'>
          <h2>写真/詳細を投稿する</h2>
          <label><input name='image' class='hidden' type="file" id="selfile"><br><div class='preview' id="bg">
            <h2 class='imagearea_message'>クリックして画像を投稿</h2>
          </div></label>
          <textarea class='comment_area' name="body" rows="8.5" cols="54" placeholder='&#13;&#10;*コメントを入力してください。&#13;&#10;特徴/首輪の有無等'></textarea>
        </div>
    </div>
        {{ csrf_field() }}
        @if (count($errors) > 0)
        <div>
          <ul>
            @foreach ($errors->all() as $error)
              <li>{{ $error }}</li>
            @endforeach
          </ul>
        </div>
        @endif
        <div class='submit_area'>
            <input class='submit_button' type=submit value='クリックして情報を保存'>
        </div>
    </form>

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Kosuke_Shibuya

    2019/12/12 14:16

    formが記述されているblade のコードを提示してください。

    キャンセル

  • k3114

    2019/12/12 14:25

    引き続きご回答ありがとうございます。
    追記させていただきました。form内の<div class="pref">ないは都道府県の選択になりますがコード量が多いので省略させていただいております

    キャンセル

回答 1

checkベストアンサー

+1

public function upload(LostRequest $request) {

        $lost = new Lost;
        $lost->user_id = $request->user()->id;
        $lost->pref    = $request->pref;
        $lost->seed    = $request->seed;
        $lost->image = empty($request->image) !== false ? '' :$request->image->getClientOriginalName(); // アップロードされたファイル名のままテーブルに保存
        $lost->body    = $request->body;
        $lost->save();

// コメントアウトもしくはここを削除
//        $this->validate($request, [
//            'image' => [
//                // アップロードされたファイルであること
//                'file',
//                // 画像ファイルであること
//                'image',
//                // MIMEタイプを指定
//                'mimes:jpeg,png',
//            ]
//        ]);

        //画像がなければ下記処理のスキップ
        if (empty($request->image) == false) {  
            if ($request->file('image')->isValid([])) {
                $file_name = $request->file('image')->getClientOriginalName(); // アップロードされたファイル名の取得
                $path = $request->image->storeAs('public',$file_name);
                return view('home')->with('filename', basename($path));
            } else {
                return redirect()
                    ->back()
                    ->withInput()
                    ->withErrors();
            }
        }
        return view('home');
    }

コントローラーに書いていたバリデーションを FormRequest にまとめて記述する。
分散しちゃうとメンテナンス性を損ねるし、それぞれが独立してエラーを出してしまいます。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'seed'  => 'required',
            'pref'  => 'required',
            'image' => 'nullable|file|image|mimes:jpg,jpeg,png',
            'body'  => 'nullable',
        ];
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/12 14:38

    なるほど、バリデーションがバラバラであったためにエラーが発生していたのですね。
    ただ、また似たエラーが出てしまったのですがお分かりになりますでしょうか?
    写真とコードは変更して追記させていただいております

    キャンセル

  • 2019/12/12 14:39

    mime->mimes

    キャンセル

  • 2019/12/12 14:42

    実現できました! 別の質問からわざわざ来て頂き本当にありがとうございます!
    とても助かりました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる