Laravelでフォームリクエストバリデーションを使う

こんにちは。コバヤシです。

今回は、Laravelでフォームリクエストを使ったバリデーションについて書きたいと思います。

フォームリクエストバリデーションとは

バリデーションロジックを含んだカスタムリクエストクラスです。コントローラーの処理に入る前のリクエストの処理の段階でバリデーションが行われます。 バリデーションでエラーがあった場合は、前ページに自動的にリダイレクトされます。
コントローラーとバリデーションロジックが分離できるので、ロジックをスッキリさせることが出来ます。

フォームリクエストを作成する

フォームリクエストは以下のコマンドで作成できます。

php artisan make:request TestRequest
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

ルールを記述する

ルールは rulesメソッド内に記述します。

<?php

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

記述方法は通常のバリデーションと同じです。

項目名を変更する

項目名を変更する場合は attributesメソッドを追加し記述します。 項目名をキーにして変更したい名称を値にセットします。

<?php
    public function attributes()
    {
        return [
            'name' => 'お名前',
            'email' => 'メールアドレス',
        ];
    }

エラーメッセージを変更する

エラーメッセージを変更する場合は messagesメソッドを追加し記述します。
項目名.バリデーション名をキーにして、表示したいメッセージを値にセットします。 メッセージ中に:attributeを記述すると項目名に置き換えてくれます。

<?php
    public function attributes()
    {
        return [
            'name.required' => ':attribute の入力をお願いします',
            'email.required' => ':attribute  の入力をお願いします',
        ];
    }

作成したフォームリクエストをコントローラーで使う

コントローラーのメソッドで、作成したフォームリクエストをタイプヒントで指定します。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Http\Requests\TestRequest;

class TestController extends Controller
{
    public function check(TestRequest $request)
    {

    }
}

これだけで、フォームリクエストを使用できるようになります。
コントローラー内では通常のリクエストと同様に使用できるので、問題ありません。

あと知っていると便利なTipsを少し。。

エラー時のリダイレクト先を変更する

エラーがあった時にリダイレクト先を変更したい時があります。
そんな時は$redirectを設定すると変更できます。

<?php
    public $redirect = "/path/to/";

バリデーションするデータを加工する

validationDataメソッドを使うとバリデーションを行うデータに対し処理を行うことが出来ます。 あくまでバリデーション時のデータなので、コントローラー内で受け取るデータには影響がありません。

<?php
    public function validationData()
    {
        $data = $this->all();

        // なんらかの処理

        return $data;
    }

まとめ

フォームリクエストは比較的簡単に使用できます。 バリデーション部分をコントローラーから分離するメリットが大きいので積極的に使っていきたいところです。