Laravel5のバリデーションはRequestClassに

Laravel5のバリデーションの設定方法が便利でイケていると思ったので取り急ぎ共有しておきます。

Modelではなく、RequestClassというものに書いていく方法

Laravel4では基本的にはControllerにバリデーションルールや設定を記入してたのが多くて、 どこに入れるべきがいいのだろうか、そこまで標準的に固まっていない印象があったが、 LaravelではRequestClassに書くのがスタンダードになりそうだ。

まずは、新規投稿用のRequestClassを作成しよう。

1
  php artisan make:request CreateUserRequest

このコマンドで作成できる。簡単である。

生成したものを以下の内容に書き換えよう。

CreateUserPost.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php namespace Lara5\Http\Requests;

use Lara5\Http\Requests\Request;

class CreateUserRequest extends Request {

    /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
    public function rules()
    {
        return [
            'name'=>'required',
            'profile'=>'required'
        ];
    }

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

}

上記設定で、nameフィールドとprofileフィールドは入力必須となったのだ。 次はControllerはもう作成した前提で話を進めていく。 次にこれをControllerに適用して、投稿時にvalidationする場合はこうかけば良い。

UsersController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

use Laravel5\Http\Requests;
use Laravel5\Http\Controllers\Controller;

class UsersController extends Controller
{

    public function create()
    {
      return view('users.create');
    }

    public function store(Requests\CreateUserRequest $request)
    {
        return $request->all();
    }

viewはこうなっているものを想定している。

create.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@extends('layouts.default')

@section('content')
    <h1>Create a new post</h1>

    @foreach($errors->all() as $error)
        <li></li>
    @endforeach

    {!!Form::open(['route'=>'users.store'])!!}
    <div>
        {!!Form::label('name', 'Name')!!}
        {!!Form::text('name')!!}
    </div>
    <div>
        {!!Form::label('profile', 'Profile')!!}
        {!!Form::textarea('profile')!!}
    </div>
    <div>
        {!!Form::submit('Submit')!!}
    </div>
    {!!Form::close()!!}
@stop

これで入力項目が未記入だった場合はエラーを出すが、 入力項目が入力されていれば、jsonで入力した内容が返ってくるはずだ。 (Laravel5は配列をそのままreturnすると配列をjsonにして返す。)

これでバリデーションに関しては終了である。

Cakeの時だとModelにバリデーションを書いていたので、 特定のActionでだけ違うバリデーションを適用させたいときは、 新規にモデルを作り、そのモデルでバリデーション処理だけを行って、保存処理は違うモデルに任せる。

みたいな処理を書いていたような記憶があるので、こういったバリデーションに柔軟性をもたせる場合はこの方法のほうが良い。 まだまだ実案件で使ってみたわけではないのでデメリットも出てきそうだが、Laravel5を使用するときはこの実装方法に落ち着きそうだ。