Laravel FormRequestでバリデーション


バリデーション

参考サイト

Laravelのvalidationメソッドでバリデーションを実装する入門編(日本語エラーメッセージ付き)
Laravelのフォームリクエストクラスでバリデーションロジックをコントローラから分離する
Laravelのバリデーションにはフォームリクエストを使おう
Laravel5.6でバリデーションなどのエラーメッセージを日本語化する方法

ItemRequestクラス
app/Http/Requests/ItemRequest
---
class ItemRequest extends FormRequest
{          
---
    public function rules()
    {
        //バリデーションルール
        return [
            'name' => 'required|string|max:191',
            'content' => 'required|string|max:191',
        ];
    }
}

・注意点 - バリデーションルールはカンマ抜けのsyntax errorレベルでも class does not existエラーになる。

コントローラー
app/Http/Controller/ItemController
<?php                                  
namespace App\Http\Controllers;        

use Illuminate\Http\Request;           
use App\Http\Requests\ItemRequest; //クラス宣言   
use App\Item;         

class ItemController extends Controller
{                                      
---中略
    //引数の型をバリデーションクラスにする
    public function create(ItemRequest $request) {
        //追加処理                                                                
        $name = $request->input('name');                                      
        $content = $request->input('content');                                
        $item = Item::create(compact('name', 'content'));
        return redirect('item/');
    }
}

$request の型を変更するだけでバリデーションされる。
バリデーション ->
OK -> メソッド処理
NG -> 元のビューにリダイレクト

resource/view/sample.blade.php
---
//バリデーションエラーの表示
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
    //バリデーションエラーなら元データを代入
    <?php
    $id = old('id');
    $name = old('name');
    ?>                                             
@endif
<form method="post" action="{{ route($address) }}">                                   
    {{ csrf_field() }}                                                                
    <div><label>商品名:</label> <input type="text" name="name" value="{{ $name }}"></div>
    <div><label>説明:</label> <textarea name="content">{{ $content }}</textarea></div>
</form>

注意 : レイアウトでもバリデーションできますが、old()が取得できませんでした。

エラーメッセージを日本語にする

/config/app.php -> locale = jp
参考サイトからエラーメッセージファイルをダウンロード
/resources/lang/en -> コピーしてjpを作成
/lang/jpにファイルを上書きコピー