はじめまして。 メドピアエンジニアの酒井です。
まだ使い始めてそんなに経っていませんが、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 | 最小値と最大値チェック |
メールアドレスチェック | |
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の利用を検討してみるのもいいかもしれませんね。