Laravelのカスタムリクエストが何かと使い方

18 回閲覧されました
みなさんこんにちは、jonioです。
今回はカスタムリクエストについてのメモです。
目次
Laravelの無料学習サイトを作りました
Laravelを勉強したい人向けの無料の学習サイトを作りました。
ここからリンクに飛べますのでぜひ利用してください。
カスタムリクエストとは
フォームから送信したデータをコントローラーに渡す前にチェックする為にあります。
チェックとは指定した型になっているか・文字数は適切になっているかなどのバリデーションのことです。
無理矢理不正な値を入力してテーブルをいじることができないようにする為に使えます。
作成コマンド
下記になります。
php artisan make:request DemoRequest
「DemoRequest」は任意の名称です。
コマンドを叩くと「Laravelのプロジェクト > app > Http > Requests > DemoRequest.php」が作成されます。
初期表示は下記です。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class DemoRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
//
];
}
}
カスタムリクエストを使えるようにするには14行目の「false」を「true」に変えます。
実際に簡単なコードでカスタムリクエストを使ってみます。
サンプルデータとカスタムリクエストと説明
下記の送信データにカスタムリクエストを使ったとします。
{
"arrays": [
{
"dataA": "A",
"detaB": 10
},
{
"detaA": "B2",
"detaB": 28
}
]
}
カスタムリクエストは下記にしたとします。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class DemoRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'arrays.*.dataA' => 'required|max:2|regex:/^[A-Za-z]+$/',
'arrays.*.detaB' => 'required|integer|min:0|max:11',
];
}
public function attributes()
{
return [
'arrays.*.dataA' => '文字',
'arrays.*.detaB' => '数字',
];
}
/**
* Get the error messages for the defined validation rules.
*
* @return array
*/
public function messages()
{
return [
'required' => ':attribute は必須です。',
'arrays.*.detaA.regex' => '文字に数字を含まないでください。',
'arrays.*.detaB.integer' => '11以下の数字を入力してください。',
];
}
}
attributes・messageメソッドは追記しています。
メソッド「rules」・「attributes」・「messages」について説明します。
rules
バリデーションのルールを設定します。
今回のデータは以下ですが「arrays.*.dataA」の「arrays」が2行目の「arrays」に対応しています。
{
"arrays": [
{
"dataA": "A",
"detaB": 10
},
{
"detaA": "B2",
"detaB": 28
}
]
}
「arrays.*.dataA」の「*」は配列のインデックス番号になります。
今回のデータの配列は2つありますが例えば直接「arrays[0][‘dataA’]」・「arrays[1][‘dataA’]」と書くのは面倒です。
だからまとめて「arrays.*.dataA」と記載します。
バリデーションルールは下記になっています。
'arrays.*.dataA' => 'required|max:2|regex:/^[A-Za-z]+$/',
'arrays.*.detaB' => 'required|integer|min:0|max:11',
「=>」の右側はバリデーションのルールです。
attributes
これはバリデーションエラーメッセージで使う時の名称の設定です。
下記になっています。
'arrays.*.dataA' => '文字',
'arrays.*.detaB' => '数字',
「=>」の右側で名称を設定しています。
これはmessagesメソッドで使います。
messages
バリデーションエラーメッセージで表示する内容を設定します。
下記になっています。
'required' => ':attribute は必須です。',
'arrays.*.detaA.regex' => '文字に数字を含まないでください。',
'arrays.*.detaB.integer' => '11以下の数字を入力してください。',
1行目の「:attribute」は先ほど説明したattributesメソッドでの名称に該当します。
attributesメソッドには下記の記述をしていました。
'arrays.*.dataA' => '文字',
'arrays.*.detaB' => '数字',
だから「:attributes」は文字または数字になります。
2行目の「arrays.*.dataA.regex」の「regex」はrulesメソッド(下記)で設定しています。
'arrays.*.dataA' => 'required|max:2|regex:/^[A-Za-z]+$/',
'arrays.*.detaB' => 'required|integer|min:0|max:11',
「required|max:2|regex:/^[A-Za-z]+$/」の「regex」のことです。
「arrays.*.dataA.regex」で「regex」のバリデーションに引っかかった時を意味しています。
「文字に数字を含まないでください。」はバリデーションエラーメッセージです。
他にも「arrays.*.dataA.max」や「arrays.*.dataB.integer」などとすることもできます。
くどいですが今回送信するデータは下記です。
{
"arrays": [
{
"dataA": "A",
"detaB": 10
},
{
"detaA": "B2",
"detaB": 28
}
]
}
インデックス番号が1の時のdataA(B2の2が含まれている)とdataB(最大数値よりも大きい)がバリデーションに引っかかっています。
だから「文字に数字を含まないでください。」・「11以下の数字を入力してください。」のバリデーションエラーが表示されます。
コントローラーでの使い方
下記の記述をします。
use App\Http\Requests\DemoRequest;
public function saveOrUpdate(KwkkrRequest $request)
{
$formData = $request->validated();
}
これでカスタムリクエストを適用できます。