はじめに
今回は、Laravelでフォームリクエストを使ったバリデーションについて書きたいと思います。
公式ドキュメントを参考に、実装を進めていきます。
1. FormRequestとは
Laravelでかけることのできるバリデーションの1つで、コントローラーの処理に入る前のリクエストの処理でバリデーションを行います。
バリデーションロジックを別クラスに切り離すことでコントローラーをシンプルにし、可読性を上げる目的で使われます。
2. FormRequestを作成する
以下のコマンドでFormRequestを作成します。
今回はTargetRequest
という名前で実装を進めていきます。
php artisan make:request TargetRequest
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class TargetRequest 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メソッド
には以下のような形式でルールを記述します。
public function rules()
{
return [
'項目名' => '検証ルール' | '検証ルール',
'項目名' => '検証ルール' | '検証ルール',
//略
];
}
今回は、以下のようなルールを指定しました。
public function rules()
{
return [
'name' => 'required|max:50',
'amount' => 'required|integer',
];
}
messagesメソッド
を追加することで、エラーメッセージをカスタマイズできます。
今回は、以下のように指定しました。
public function messages()
{
return [
'name.required' => '目標は必須です。',
'name.max' => '文字数をオーバーしています。',
'amount.required' => '目標額は必須です。',
'amount.intger' => '正しい形式で入力してください。',
];
}
また、API実装時のバリデーションエラーでJSONレスポンスを返したいときには、
FormRequestのfailedValidationメソッド
をオーバーライドして、エラー時のフォーマットを変更することができます。
protected function failedValidation(Validator $validator): HttpResponseException
{
$response = response()->json([
'status' => 'validation error',
'errors' => $validator->errors()
], 422);
throw new HttpResponseException($response);
}
3. コントローラーを編集する
FormRequestを使用しない場合
FormRequestを使用しない場合は、以下のような記述でバリデーションをかけることができます。
public function store(Request $request)
{
$rule = [
'name' => 'required|max:50',
'amount' => 'required|integer',
];
$this->validate($request, rule);
//略
}
FormRequestを使用する場合
コントローラーのメソッドで、作成したFormRequestをタイプヒントで指定します。
public function store(TargetRequest $request)
{
//略
}
バリデーションロジックをコントローラーから分離することができました。
以上で実装完了です。
FormRequestでバリデーションを作成することで可読性・保守性が上がります。
Fat Controllerを防ぐことにつながるので、積極的に活用していきたいです。
4. 参考文献