[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);
    }

hoge.blade.php

<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に上げることになったので
再度試したらうまくいった。



PHPフレームワーク Laravel入門

PHPフレームワーク Laravel入門