こんにちは、JeffTechです。
説明
LaravelでAPIを作成している時に、バリデーションエラーを出力させるメソッドを全てのリクエストフォームに書くのがしんどくなったので、トレイトでまとめることにしました。
開発環境
- OS: MacOS
- PHP: 7.3
- Laravel 6.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