[PHP][Laravel] APIのResponseデータをカスタムしてシステム内でレスポンス形式をルール化・共通化する
バージョン
Laravel 5.8
概要
レスポンスマクロを用いて、APIのレスポンスデータをカスタムして 成功時とエラー時(HTTPステースコードは200を返して、受信側でエラー処理をさせる)のフォーマットを合わせる。
コード
ServiceProviderクラスを追加する。
■app/Providers/ApiResponseServiceProvider.php (新規追加)
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Response; class ApiResponseServiceProvider extends ServiceProvider { /** * response macro * * @return void */ public function boot() { // success Response::macro('success', function ($data = [], $extraData = []) { return response()->json([ 'success' => true, 'response' => $data, 'extra' => $extraData ]); }); // error(画面側でエラー処理させる) Response::macro('error', function ($errMsg = '', array $errors = []) { return response()->json([ 'success' => false, 'errMsg' => $errMsg, 'errors' => $errors ]); }); // error Response::macro('fatalError', function ($errMsg, array $errors = [], $status = ResponseStatus::HTTP_INTERNAL_SERVER_ERROR) { return response()->json([ 'success' => false, 'status' => $status, 'errMsg' => $errMsg, 'errors' => $errors ], $status); }); } }
success時にはなんでも使える領域としたextraがあると便利。
■config/app.php
'providers' => [
App\Providers\CoreServiceProvider::class,
// 以下を追加
App\Providers\ApiResponseServiceProvider::class,
],
これで準備は完了。使用例を記載。
■ApiHogeController.php
public function testApi(Request $request) { $params = $request->all(); $validator = Validator::make($params, [ 'remarks' => 'required|max:80', ]); if ($validator->fails()) { return response()->error($validator->errors()->all()); } $fruits = Fruit::getList(); return response()->success($fruits); }
<script> $(function() { var remarks = $('#remarks').val(); $.ajax({ type:'POST', url: "{{ url('/api/hoge') }}", data: {remarks:remarks}, headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'), }, success:function(data){ if(data.success){ var fruits = data.result; fruits.forEach(function (ele) { var addDiv = '<div>' + ele.name + </div>'; $(addDiv).appendTo('.addArea'); }); }else{ alert(data.errMsg); } }, error: function(XMLHttpRequest,textStatus,errorThrown) { console.log(textStatus); } }); }); </script>
もしresponse()->success($fruits)
呼び出しでそんなメソッドないぞってエラーが出た場合について。
Laravel自体を再インストールすると解決したとstackoverflowに記載があった。
自分の場合はバージョン5.7でエラー状態になり、たまたま別件で5.8に上げることになったので
再度試したらうまくいった。