メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックリーディングカンパニーのエンジニアブログです。PHPからRubyへ絶賛移行中!継続的にアウトプットを出し続けられるようにみんなでがんばりまっす!

Laravel5.0:FormRequestを使ったValidation

はじめまして。 メドピアエンジニアの酒井です。

まだ使い始めてそんなに経っていませんが、Laravelの小ネタを紹介したいと思います。

Laravel5.0で導入されたFormRequestを使用して Controllerをスッキリさせる方法です。

Laravelを触ったのは5.0が始めてですが。

実際に見てみる

まず、最初に通常のValidationの書き方はこんな感じです。

<?php

use App\Http\Requests\Request;

Class SampleController extends Controller
{
    public function getIndex(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email'
        ]);
        if ($validator->fails()) {
        }
    }
}

見ても分かるようにContollerに記述していくとForm項目が増えるにつれ、 Controllerに大量のValidation設定を記述する事になります。

次にFormRequestを使用したControllerです。

<?php

use App\Http\Requests\SampleRequest;

Class SampleController extends Controller
{
    public function getIndex(SampleRequest $request)
    {
    }
}

すっきりしましたね!

FormRequestって何?

Laravel5.0から導入されたValidation処理を含んだRequestクラスとなります。

詳しくはこちら

リクエストをdispatchした際、Controllerメソッドの依存関係を解決した後に validate()が実行されるようになっています。

つまり、FormRequestを使用するとControllerメソッドの実行前に Validationの実行が完了している事になります。

FormRequestの使い方

<?php

use App\Http\Requests\Request;

Class SampleRequest extends Request
{
    //認証ユーザーが権限あるかチェックする
    public function authorize() {
        return true;
    }

    //Validationの設定
    public function rules() {
        return [
            'name' => 'required',
            'email' => 'required|email'
        ]
    }

    //エラー文言の設定
    public function messages() {
        return [
            'name.required' => 'The :attribute field is required.',
            'email.required' => 'The :attribute field is required.',
            'email.email' => 'The :attribute must be a valid email address.',
        ];
    }
}

public function authorize()

権限チェックする必要ない場合もこれを指定しないとエラーとなりますので 必ず記述するようにします。

あとはviewに以下のように記述すれば、Form画面にエラーを出力できるようになります。

@if (count($errors) > 0)
    @foreach ($errors->all() as $error)
        {{ $error }}
    @endforeach
@endif

エラー時のリダイレクト先は特に指定がなければ、前画面(Form画面)になります。

頻度の高いValidationルール

rule 内容
alpha 英字チェック
alpha_num 英数字チェック
between:min,max 最小値と最大値チェック
email メールアドレスチェック
numeric 数字チェック
regex 正規表現によるチェック ※1
required 入力値の存在チェック
same:field 指定されたフィールドとの同値チェック

詳しくはこちら

※1 regexで「|」を使用する場合はrulesの指定を配列にしないと動作しません。

<?php
    public function rules() {
        return [
            'sort' => ['regex:/^(desc)|(asc)$/']
        ]
    }
}

これでしばらくハマりました。。。

まとめ

Illuminate\Foundation\Http\FormRequestを見ると リダイレクト先やエラー時の挙動を変更できるようになっているので、 Validation関連のだいたいの事はFormRequestで行えると思います。

ControllerがValidation設定ばかりになってきたら、 FormRequestの利用を検討してみるのもいいかもしれませんね。