🎃

Laravel 8のAPIでJSONデータをバリデーション - FormRequest - 無解説メモ

2021/10/31に公開

内容

  • LaravelのAPIで、FormRequestクラスを利用してJSONデータに対しバリデーションを行う際の実装メモ

実装メモ

個別のフォームリクエストクラス作成

php artisan make:request StorePostRequest

バリデーションエラー考慮

FormRequestfailedValidation(Validator $validator)をオーバーライドしてエラー時のデータフォーマットをカスタマイズ

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

namespace App\Http\Requests;

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

abstract class ApiRequest extends FormRequest
{
    /**
     * Handle a failed validation attempt.
     *
     * @param  Validator  $validator
     * @return void
     *
     * @throws HttpResponseException
     */
    protected function failedValidation(Validator $validator)
    {
        $data = [
            'message' => __('The given data was invalid.'),
            'errors' => $validator->errors()->toArray(),
        ];

        throw new HttpResponseException(response()->json($data, 422));
    }
}
補足:__(string)について

__(string)はローカライズ考慮。
localeの制御や、言語ファイルの準備などが必要のため、ここでは割愛
<参考>

config/app.php
'locale' => 'ja',
resources/lang/ja.json
{"The given data was invalid.": "送信データのチェックで不備が見つかりました。",}

作成したフォームリクエストクラスの親クラスを変更

app/Http/Requests/StorePostRequest.php
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequestclass StorePostRequest extends ApiRequest

認可

authorize()に認可処理を実装

app/Http/Requests/StorePostRequest.php
    public function authorize()
    {
        // ToDo 適切な認可処理を実装
        return true;
    }

バリデーション処理を実装

rules()にバリデーション処理を実装

app/Http/Requests/StorePostRequest.php
public function rules()
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => ['required', 'max:2000'],
        ];
    }

※'|'区切りだけではなく、配列記述も可能

参考:StorePostRequest全体
app/Http/Requests/StorePostRequest.php
<?php

namespace App\Http\Requests;

class StorePostRequest extends ApiRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // ToDo 適切な認可処理を実装
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => ['required', 'max:2000'],
        ];
    }
}

コントローラーメソッドのパラメータを置き換え

app/Http/Controllers/AnyController.php
public function store(Request $request)public function store(StorePostRequest $request)

実装は以上
Insomniaなどで動作確認

ネストされたJSONデータのバリデーション参考

参考データ

バリデーション対象のJSONデータ

{
    "user": {
        "name": "山田太郎",
        "birthday": "2000-04-01"
    }
}

バリデーション例

ルールの記述方法
ネストされたフィールドは、ピリオド区切りで記述

public function rules()
{
    return [
        'user' => ['required', 'array'],
        'user.name' => ['required', 'string', 'max:12'],
        'user.birthday' => ['date', 'nullable'],
    ];
}

バリデーション言語ファイル例

バリデーションエラーメッセージのフィールド日本語化

resources/lang/ja/validation.php
'attributes' => [
        'user' => [
            'name' => 'お名前',
            'birthday' => '生年月日',
        ],
    ],

補足

使用可能なバリデーションルール

Laravel JetStreamの日本語化について

以上

Discussion