Laravel5.2でFormRequestを使ってvalidateしてみる。

# 自己紹介
HAL大阪の2回生で、サーバーサイドエンジニアを目指して修行しています。
初めて記事を書くので至らないところが多々あると思いますが、暖かい目で見守ってやってください。

##前提
Laravelの導入は[こちら](http://qiita.com/niiyz/items/cbd503398299818a9e8a#vagrant%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%BE%E3%81%99)を参考にさせていただきました。

##では早速本題へ
今回は、シンプルなフォームを作成してその入力チェックをしてみたいと思います。

###ビューの作成
まず、resources/viewsの中にpagesディレクトリを作成し、フォームのviewファイルを作成します


#####いい感じにサンプルフォームを作成
```php:resorce/views/pages/form.blade.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>sampleForm</title>
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
            <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>

    <body>
    <h1 class="text-center">Sample Form</h1>

    <form id="sampleForm" action="/form/result" method="POST">
      {!! csrf_field() !!}
        <div class="row">
            <div class="form-group col-md-4 col-md-offset-4">
                <label for="name">Name</label>
                <input type="text" class="form-control" id="name" name="name" placeholder="Name" value="{{ old('name') }}">
                @if ($errors->has('name'))
                    <span class="help-block">
                        <strong>{{ $errors->first('name') }}</strong>
                    </span>
                @endif
            </div>

            <div class="form-group col-md-4 col-md-offset-4">
                <label for="email">Email</label>
                <input type="email" class="form-control" id="email" name="email" placeholder="Email" value="{{ old('email') }}">
                @if ($errors->has('email'))
                    <span class="help-block">
                        <strong>{{ $errors->first('email') }}</strong>
                    </span>
                @endif
            </div>

            <div class="form-group col-md-4 col-md-offset-4">
                <label for="password">Password</label>
                <input type="password" class="form-control" id="password" name="password" placeholder="Password">
                @if ($errors->has('password'))
                    <span class="help-block">
                        <strong>{{ $errors->first('password') }}</strong>
                    </span>
                @endif
            </div>

            <div class="form-group col-md-4 col-md-offset-4">
                <label for="password-confirm">Password-confirm</label>
                <input type="password" class="form-control" id="password-confirm" name="password_confirmation" placeholder="Password-confirm">
                @if ($errors->has('password_confirmation'))
                    <span class="help-block">
                        <strong>{{ $errors->first('password_confirmation') }}</strong>
                    </span>
                @endif
            </div>

            <div class="form-group col-md-4 col-md-offset-4">
                <input type="submit" class="btn btn-default col-md-12" value="送信">
            </div>
        </div>
    </form>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </body>

</html>
```

#####いい感じに入力値を表示するビューを作成
```php:resorce/views/pages/formResult.blade.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>sampleForm</title>
        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <!--[if lt IE 9]>
            <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
            <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>

    <body>
    <h1 class="text-center">正しい値が送信されました。</h1>
    <table class="col-md-4 col-md-offset-4">
        <tr style="border-bottom: solid 1px;">
            <th>name : </th>
            <td>{{$name}}</td>
        </tr>
        <tr style="border-bottom: solid 1px;">
            <th>email : </th>
            <td>{{$email}}</td>
        </tr>
        <tr style="border-bottom: solid 1px;">
            <th>password : </th>
            <td>{{$password}}</td>
        </tr>
    </table>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </body>

</html>
```

###リクエストの作成
artisanを利用してリクエストの雛形を作成します。

```
php artisan make:request FormRequest
```

すると、app/Http/Requests配下にFormRequest.phpが生成されますので、以下のように編集

```php:app/Http/Requests/FormRequest.php
<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class FormRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; //trueに変更
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
        //バリデーションルールの設定
            'name' => 'required|max:10',
            'email' => 'required',
            'password' => 'required|min:8|confirmed',
            'password_confirmation' => 'required|min:8',
        ];
    }
}
```

###コントローラーの作成
こちらもまたartisanを利用してコントローラーの雛形を作成します。

```
php artisan make:controller FormController
```

実行するとapp/Http/Controllers配下にFormController.phpが生成されますので、こちらは下記のように書き換える。

```php:app/Http/Controllers/FormController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
//作成したリクエストをuse
use App\Http\Requests\FormRequest;

class FormController extends Controller
{
    //formResultメソッドを作成
    //※引数に注目※
    public function formResult(FormRequest $request)
    {
        //入力値を表示させるviewを返す
        return view('pages.formResult', $request->all());
    }
}
```

こんな風に、formResultメソッドで利用するリクエストを指定します。
FormRequestのバリデートを通過した場合のみformResultメソッドの処理が実行されるので、controllerのコードがシンプルになり、非常に便利な機能ですね。

###最後にルーティングを設定
```php:app/Http/routes.php
Route::get('/form', function () {
    return view('pages.form');
});

Route::post('/form/result', 'FormController@formResult');
```

###ちょっとまて、エラーメッセージが英語じゃないか。
心配しないでください、ちゃんとエラーメッセージも指定できます。
FormRequestにmessagesメソッドを実装しましょう。

```php:app/Http/Requests/FormRequest.php
public function messages()
{
    return [
    'name.required' => 'nameを入力してください。',
    'name.max' => 'nameは10字以内でお願いします。',
    'email.required' => 'emailを入力してください。',
    'password.required' => 'passwordを入力してください。',
    'password.min' => 'passwordは8字以上でお願いします。',
    'password.confirmed' => '確認passwordと一致しません。',
    'password_confirmation.required' => '確認用passwordを入力してください。',
    'password_confirmation.min' => '確認用passwordも8字以上でお願いします。',
    ];
}
```

こんな感じで簡単にバリデーションを実装できるようになっています。
##あとがき
えー、今回はシンプルなカスタムリクエストでバリデーションを行ってみましたが、
次記事を書く機会がありましたら自分でバリデーションルールを追加する方法でも書いてみようかなと思います。

ソースコードはgitにあげておきましたのでよかったら[こちら](https://github.com/syota-ohtuka/form-validate)からどうぞ。

わかりにくい、間違っているなどの指摘、意見等あればコメント欄にお願いします！！

ありがとうございました！