0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Laravel]フォームリクエストでバリデーションを実装する

Posted at

はじめに

今回は、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. 参考文献

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?