🎃
Laravel 8のAPIでJSONデータをバリデーション - FormRequest - 無解説メモ
内容
- LaravelのAPIで、FormRequestクラスを利用してJSONデータに対しバリデーションを行う際の実装メモ
実装メモ
個別のフォームリクエストクラス作成
php artisan make:request StorePostRequest
バリデーションエラー考慮
FormRequest
のfailedValidation(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 FormRequest
↓
class 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の日本語化について
-
Laravel Lang
https://laravel-lang.github.io/lang/ -
わかりやすい解説(感謝)
https://php-junkie.net/framework/laravel/jetstream-ja/
以上
Discussion