はじめまして。 メドピアエンジニアの酒井です。
まだ使い始めてそんなに経っていませんが、Laravelの小ネタを紹介したいと思います。
Laravel5.0で導入されたFormRequestを使用して Controllerをスッキリさせる方法です。
Laravelを触ったのは5.0が始めてですが。
実際に見てみる
まず、最初に通常のValidationの書き方はこんな感じです。
<?phpuse App\Http\Requests\Request; Class SampleController extends Controller {publicfunction getIndex(Request $request){$validator= Validator::make($request->all(), ['name'=>'required', 'email'=>'required|email']); if($validator->fails()){}}}
見ても分かるようにContollerに記述していくとForm項目が増えるにつれ、 Controllerに大量のValidation設定を記述する事になります。
次にFormRequestを使用したControllerです。
<?phpuse App\Http\Requests\SampleRequest; Class SampleController extends Controller {publicfunction getIndex(SampleRequest $request){}}
すっきりしましたね!
FormRequestって何?
Laravel5.0から導入されたValidation処理を含んだRequestクラスとなります。
詳しくはこちら
リクエストをdispatchした際、Controllerメソッドの依存関係を解決した後に validate()が実行されるようになっています。
つまり、FormRequestを使用するとControllerメソッドの実行前に Validationの実行が完了している事になります。
FormRequestの使い方
<?phpuse App\Http\Requests\Request; Class SampleRequest extends Request {//認証ユーザーが権限あるかチェックするpublicfunction authorize(){returntrue; }//Validationの設定publicfunction rules(){return['name'=>'required', 'email'=>'required|email']}//エラー文言の設定publicfunction 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の指定を配列にしないと動作しません。
<?phppublicfunction rules(){return['sort'=>['regex:/^(desc)|(asc)$/']]}}
これでしばらくハマりました。。。
まとめ
Illuminate\Foundation\Http\FormRequestを見ると リダイレクト先やエラー時の挙動を変更できるようになっているので、 Validation関連のだいたいの事はFormRequestで行えると思います。
ControllerがValidation設定ばかりになってきたら、 FormRequestの利用を検討してみるのもいいかもしれませんね。