こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在4社経験している、11年目エンジニアです。
この記事では、 PHPのフレームワークの1つのLaravelでAPIでリクエストに対してバリデーションするやり方を丁寧に解説します。
APIの基本的な実装のやり方については、こちらの記事をご参考ください。
前提条件:実行環境について
実行環境は以下の通りです。
OS | Windows10 |
---|---|
PHPのバージョン | 8.0.3 |
Laravelのバージョン | 8.42.1 |
Postmanのバージョン | 8.7.0 |
この記事では
C:\Laravel\LaravelSample
配下にLaravelのプロジェクトを作成しています。
PostmanはAPIのレスポンスを確認するために使います。
インストールするやり方はこちらの記事をご参考ください。
APIでリクエストに対してバリデーションするやり方を解説
APIでリクエストに対してバリデーションするやり方をサンプルプログラムをまじえて解説します。
リクエストに対してバリデーションをするには、FormRequestを使います。
作成するコマンドは
1 |
php artisan make:request 【作成するRequestの名前】 |
です。
詳しくは、こちらの記事をご参考ください。
この記事では【SampleRequest】という名前のFormRequestを使って解説していきます。
新規作成された直後の中身は↓のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class SampleRequest 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 [ // ]; } } |
このFormRequestに対して、バリデーションを定義するために必要な
- authorizeメソッド
- rulesメソッドでバリデーションを定義
- エラーレスポンスを定義
をそれぞれ解説していきます。
authorizeメソッド
authorizeメソッドの解説をします。
authorizeメソッドとは、ユーザーが指定したリクエストへの権限をチェックするメソッドです。
authorizeメソッドがfalseを返した場合、HTTPステータスコードが403のレスポンスが返されます。
なので
- ユーザー認証は別のところで行う
- そもそも認証チェックが不要
という場合、authorizeメソッドが返す値はtrueに指定する必要があります。
この記事では、trueを返すようにします。
1 2 3 4 |
public function authorize() { return true; } |
rulesメソッドでバリデーションを定義
rulesメソッドでバリデーションを定義の解説をします。
バリデーションは連想配列で定義します。
サンプルは以下になります。
1 2 3 4 5 6 7 8 9 10 11 |
public function rules() { return [ 'user_name' => 'required', 'age' => [ 'required', 'numeric' ], 'job' => 'max:7' ]; } |
連想配列のキーにはバリデーションをかけたいリクエストのキーを指定し、値にはバリデーションを指定します。
【age】のように値に配列を指定すれば、複数のバリデーションをかけることも可能です。
指定しているバリデーションの意味は以下になります。
バリデーション | 意味 |
---|---|
required | 必須 |
numeric | 数値かどうか |
max:7 | 7文字以内であるか |
サンプルの定義だとそれぞれのキーにかけられるバリデーションは以下の意味になります。
キー | バリデーション |
---|---|
user_name | 必須 |
age | 必須かつ数値であるか |
job | 7文字以内であるか |
rulesメソッドで各キーに対して、適切なバリデーションを指定します。
この記事では3つのみ紹介しましたが、他にもバリデーションルールはたくさんあります。
詳しくは、こちらの記事をご参考ください。
エラーレスポンスを定義
エラーレスポンスを定義の解説をします。
そもそもなぜエラーレスポンスを定義する必要があるかと言うと、もしエラーレスポンスを定義せずエラーが発生した場合、HTMLのレスポンスが返ってくるからです。
画面からのリクエストだった場合、それでよいかもしれません。
が、APIだと不便です。
そのため、APIのエラーレスポンスはjsonで返すよう定義する必要があります。
エラーレスポンスを定義するには、failedValidationメソッドをオーバーライドします。
書き方サンプルは以下になります。
1 2 3 4 5 6 7 8 |
protected function failedValidation(Validator $validator) { $res = response()->json([ 'errors' => $validator->errors(), ], 400); throw new HttpResponseException($res); } |
上記を指定するには
1 2 |
use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; |
を宣言する必要があります。
「400」とは、エラーレスポンスだった場合返すHTTPステータスのことです。
failedValidationメソッドのvalidator変数には、バリデーションを実行し失敗した後のvalidatorが指定されます。
そのため
1 |
$validator->errors() |
で、バリデーションのエラーメッセージを取得できます。
返り値を
1 |
throw new HttpResponseException($res); |
で返します。
FormRequestサンプルプログラム
解説した
- authorizeメソッド
- rulesメソッドでバリデーションを定義
- エラーレスポンスを定義
上記3つを設定したFormRequestサンプルプログラムの全文は以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; class SampleRequest extends FormRequest { /** * 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 [ 'user_name' => 'required', 'age' => [ 'required', 'numeric' ], 'job' => 'max:7' ]; } protected function failedValidation(Validator $validator) { $res = response()->json([ 'errors' => $validator->errors(), ], 400); throw new HttpResponseException($res); } } |
FormRequestをコントローラーに設定する
FormRequestが完成したら、コントローラーに設定します。
コントローラーに使いたいFormRequestを
1 |
use App\Http\Requests\SampleRequest; |
と宣言し、メソッドの引数に
1 2 3 4 5 6 7 8 9 |
public function apiHello(SampleRequest $request) { return response()->json( [ 'id' => $request->input('id'), 'user_name' => $request->input('user_name') ] ); } |
と設定してあげれば、バリデーションをかけることができるようになります。
APIを実行し確認する
FormRequestが完成し、コントローラーにも設定したので、バリデーションエラーが返るか確認します。
まず、Laravelでサーバーを立ち上げます。
コマンドは
1 |
php artisan serve |
です。
サーバーを立ち上げるコマンドの詳細な説明は、こちらの記事をご参考ください。
APIのレスポンスを確認するためにPostmanを起動します。
基本的な使い方については、こちらの記事をご参考ください。
KEYとVALUEに以下を設定し、【Send】ボタンを押します。
KEY | VALUE |
---|---|
user_name | 空 |
age | aaaaa |
job | programmer |
指定したバリデーションの通りに、HTTPステータスが400でエラーレスポンスが返ってくることが確認できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "errors": { "user_name": [ "The user name field is required." ], "age": [ "The age must be a number." ], "job": [ "The job must not be greater than 7 characters." ] } } |
まとめ:APIでリクエストに対してバリデーションしたい場合FormRequestを使おう
以上がLaravelでAPIでリクエストに対してバリデーションするやり方の解説でした!
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント