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で実装することになります。