Laravel5.5 FormRequest が実行されない??


はじめに

入力フォームのバリデーションにはいくつかの種類があるんやけど。
わいが一番好きなのはFormRequestなんや。

なんでかって??
それはバリデーションだけ別ファイルに書くことにができるから便利なんよ。
コントローラーにバリデーション書くとコントローラーが読みにくくなるからいいよね〜。

そんな、FromRequest大好きなわいが時々起こしてしまう事件に対してのQiitaです。
みんなもこんなことならんようきいつけて〜や。

現象

入力フォームで何かしら入力し送るとバリデーションエラーないし、データ送信ができるはずなんやけど、何も表示されないまま、入力フォームに画面が戻ってくる現象に関してWHY となったのでQiitaを書きます。

なんも表示されてないから何が起きているのかわかんない。そんな時、大体ここら辺が原因かなって心当たりがあることを書いていきます。

・FormRequestの指定が間違ってる。
・入力フォームにエラー表示されるようなコードを書いていない。
・誤字

FormRequestを作成するところからみていきます。

0. FormRequest作成

今回は返信(Reply)フォームに対してのバリデーションです。
まず、artisanコマンドでファイルを作成します。

 php artisan make:request ReplyRequest

次にファイル内の編集です。
今回は返信するだけのフォームです。
入力フォームでのタグにつけたnameはreplyです。

App\Http\Requests

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ReplyRequest extends FormRequest
{

    public function authorize()
    {
        return true;//false->trueへ変更
    }

    public function rules()
    {
        return [    
            //フォームでのnameを記載し、バリデーションルールを書く。
            'reply' => 'required|max:200',
        ];
    }
    //表示されるメッセージを自分で書きたい人は書く。
    public function messages() {
        return [
            'reply.required' => '返信は入力してください。',
            'reply.max' => '200文字以内で入力してくだい。',
        ];
    }
}

1. FormRequestの名前やnamespaceあってる??

よくあるパターンです。
コントローラーに書いてある、ReplyRequestの指定が間違っているパターン。

controller.php
//① useに記載ミスがないか?
use App\Http\Requests\ReplyRequest;

//② ()内に指定してあるか?
public function store(ReplyRequest $request) {

}

2. 入力フォームにエラーが表示されるようになってる??

うっかりさんがやってしまいがちなのは、入力フォームにエラーが表示される設定をしていないパターンです。
バリデーションのエラーだから、FormRequestのファイルかControllerだろう?っと思っている方には落とし穴です。

view

<form action="{{ route('store') }}" method="post">
{{ csrf_field() }}

@if($errors->has('reply')) <span class="text-danger">{{ $errors->first('reply') }}</span>@endif
<textarea name="reply"></textarea>

<input type="submit" value="返信する">
</form>

上記の
<span class="text-danger">{{ $errors->first('reply') }}</span>
がないとエラーがあっても表示されません。

@if($errors->has('reply'))はエラーがあった時、という場合にのみエラー表示させたいので、if文で囲います。

つけ忘れがないか注意しましょう。

ちなみに@if($errors->has('reply'))reply<textarea name="reply">replyからきています。

3. nameの入力ミス

入力フォームでのフォームのname指定はとても重要です。
今回の場合、<textarea name="reply">ですね。

このnameでバリデーションはもちろん、コントローラーにPOST送信された情報を取得するにも使用するからとても重要です。

なので、このnameに入力ミス、またバリデーション指定する際にFormRequestでの指定ミスなどがあるとFormRequestが指定されているにもかかわらず、nameがなくバリデーション自体実行されないまま元の入力フォームへ戻ってきてしまいます。

1. FormRequestの名前やnamespaceあってる??
2. 入力フォームにエラーが表示されるようになってる??

上記の2点をチェックして、まだ改善されないようなら誤字がないか確認してみましょう。

以上になります!
時々引っかかってします沼でした
まだまだひよっこ故、何かあれば編集リクエストいただければ幸いです。