LaravelでRequest Classを使用してValidationを実装する

バジル
2019-06-07
バジル
2019-06-07

前置き

今回はRequestクラスを作成し、
そこでValidationを実行してみたいと思います。

ControllerでValidationを実装することもできますが、
Laravel作法的にはRequestクラスを作成し、
そこでValidationを実装することが望ましいです。

Requestクラスを作成する

手動で作成しても良いのですが、
せっかくartisanコマンドがあるので、
Artisanコマンドで生成してみます。
```
php artisan make:request TestRequest
```
これで app/Http/Requests/TestRequest.phpが生成されているはずです。

生成したRequestを編集する

```
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

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

    /**
    * Get the validation rules that apply to the request.
    *
    * @return array
    */
    public function rules()
    {
      return [
      //
      ];
    }
}
```
このなかのrulesに前回ご紹介した、
Controllerでのvalidation実装と同じ内容を記述します。
```
return [
    'name' => 'required|string|min:1|max:25',
    'date' => 'nullable|date',
];
```
次に、ControllerにこのRequestを実装させます。

前回作成したControllerのactionは次のようになっています。
```
public function store (Request $request)
{

    // ルールを設定
    $rules = [
      'name' => 'required|string|min:1|max:25',
      'date' => 'nullable|date',
    ];

    // 次の引数を渡してValidateする
    $validation = Validator::make($request->all(), $rules);

    if ($validation->fails()){
      return redirect()->back()->withErrors($validation->errors())->withInput();
    }

    (new Members())->insert($request->all());

    return view(‘store’);
}

```
このRequestを変更します
```
public function index (TestRequest $request)
{
    (new Members())->insert($request->all());

    return view(‘store’);
}
```
こうすると、Controllerのindexに到達する前に
Validationの結果を返すことになり、
処理を始める前に落とすことができて、安全です。

ただ、条件によってValidationのルールが変わることもあるので
その場合はControllerで実装することになります。