Laravel5.7:FormRequestを使ってバリーデーションを実装する

Laravel

公式のドキュメントを確認するとController内に記述するやり方が紹介されていますが、これだとControllerのソースが見にくくなるので、FormRequestに分けて実装して行きます。

FormRequestの作成

まずはartisanを使用してFormRequsetの雛形を作成します。

php artisan make:request UserFormRequest

コマンドを実行すると以下のようにファイルが作成されます。

app
├── Http
│   └── Requests
│       └── UserRequest.php

ルールとメッセージを設定

バリデーションのルールとメッセージを設定します。簡単に必須チェックだけしています。
rulesメソッドにバリデーションのルールを記載して、エラーメッセージをカスタマイズしたい場合は、messagesメソッドを追記します。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => [
                'required',
            ],
            'address' => [
                'required'
            ]
        ];
    }

    public function messages()
    {
        return [
            'name.required' => '名前は必ず指定してください。',
            'address.required' => '住所は必ず指定してください。'
        ];
    }
}

Controllerからの呼び出し

こちらはメソッドインジェクションするだけです。バリデーションエラーがある場合は前の画面に自動的に遷移してくれます。

use App\Http\Requests\UserRequest;

class UserController extends Controller
{
    public function store(UserRequest $request)
    {
        dd($request->validated());

入力画面でエラーを表示

入力画面のViewにエラーを表示する箇所を用意しておきます。

                @if ($errors->any())
                    <div class="alert alert-danger">
                        <ul>
                            @foreach ($errors->all() as $error)
                                <li>{{ $error }}</li>
                            @endforeach
                        </ul>
                    </div>
                @endif

その他

Httpメソッドによってバリデーションルールを変更 ※ 追加:2019.1.18

新規作成(POST)と更新(PUT)で、バリデーションルールを変更したいときにルールを設定する箇所でメッソド判定を追加します。

    public function rules()
    {
        if ($this->isMethod('post')){
            // 新規作成
            return [
                'name' => [
                    'required',
                ]
            ];
        }
        else{
            // 更新
            return [
                'name' => [
                    'required',
                ],
                'description' => [
                    'required'
                ]
            ];
        }
    }

URLのパスによってバリデーションルールを変更 ※ 追加:2019.1.18

需要があるかわかりませんが、URLのパスによって変更する場合はRouteで指定したnameを使用します。

    Route::post('hoge/data1', 'HogeController@store1')->name('hoge.store1');
    Route::post('hoge/data2', 'HogeController@store2')->name('hoge.store2');
    public function rules()
    {
        if ($this->routeIs('hoge.store1')){
            // hoge/data1
            return [
                'name' => [
                    'required',
                ]
            ];
        }
        else{
            // hoge/data2
            return [
                'name' => [
                    'required',
                ],
                'description' => [
                    'required'
                ]
            ];
        }
    }

まとめ

バリデーションをFormRequestにまとめることができたのでかなりController内のソースがスッキリしました。
以下は、参考にしたサイトです。

Laravel5.6, 5.7 バリデーションを記述→個別化(FormRequest)
こんにちは、のるぼるのんです。今回もLaravel5.6, 5.7の機能を紹介していきます! &nb

コメント