3
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 バリデーション内の共通処理をトレイトでまとめて定義する

Last updated at Posted at 2021-04-23

こんにちは、JeffTechです。

説明

LaravelでAPIを作成している時に、バリデーションエラーを出力させるメソッドを全てのリクエストフォームに書くのがしんどくなったので、トレイトでまとめることにしました。

開発環境

  • OS: MacOS
  • PHP: 7.3
  • Laravel 6.2

実装の流れ

  1. トレイトの作成&編集
  2. トレイトをリクエストフォームでuseする

実装

トレイトの作成&編集

まずは、共通処理をまとめるトレイトの作成を行います。

$ touch app/Http/Requests/ValidationFailedTrait.php

次に、作成したトレイトの編集を行います。

app/Http/Requests/ValidationFailedTrait.php
<?php

namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

trait ValidationFailedTrait
{
    /**
     * エラーメッセージを出力
     * 
     * @return viod
     */
    protected function failedValidation(Validator $validator)
    {
        $response['errors'] = $validator->errors()->toArray();

        throw new HttpResponseException(
            response()->json(
                $response,
                422,
                [],
                JSON_UNESCAPED_UNICODE,
            )
        );
    }

    /**
     * 共通エラーメッセージ(あれば)
     */
    public function messages()
    {
        return [
            //
        ];
    }

    /**
     * 共通エラー文言(あれば)
     */
    public function attributes()
    {
        return [
            //
        ];
    }
}

Response::json()の第4引数に、JSON_UNESCAPED_UNICODEを設定すると、unicodeで日本語をエスケープせずにそのまま返してくれます。

トレイトをリクエストフォームでuseする

今回は、例としてPostRequest.phpというリクエストフォームがあったと仮定して、その中でトレイトをuseしてみます。

app/Http/Requests/PostRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{

    use ValidationFailedTrait;

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

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

PostRequestクラスの中でuse ValidationFailedTrait;と記述するだけです。
これを、各リクエストフォームに記述するだけで、エラーメッセージ出力の処理が共通化できました。

最後に

少しでも役に立った!という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね!
https://twitter.com/jefftechsaku

3
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
3
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?