Laravelapi 自定義 response 格式

北行 發表於2019-10-09

laravel的http路由檔案有兩個api.phpweb.php

➜  ~ ll /Users/shiwenyuan/test/test_demo/routes
total 32
drwxr-xr-x   6 shiwenyuan  staff  192 10  9 12:19 ./
drwxr-xr-x  26 shiwenyuan  staff  832 10  9 10:29 ../
-rw-r--r--   1 shiwenyuan  staff  572 10  9 12:19 api.php
-rw-r--r--   1 shiwenyuan  staff  508 10  9 10:28 channels.php
-rw-r--r--   1 shiwenyuan  staff  553 10  9 10:28 console.php
-rw-r--r--   1 shiwenyuan  staff  453 10  9 10:35 web.php
從命名上不難理解`web.php`為web服務的路由(用到了檢視層),`api.php`則是做api服務(只負責返回資料)

直接在app/Http/Controllers/Controller.php中新增實現,然後因為所有控制器都整合了Controller,所以就會有他的所有public方法,但是這麼寫個人感覺不夠優雅,與laravel的核心思想背道而馳,所以我就把相關實現放到了Provider

 建立response服務供應者

php artisan make:provider ResponseMacroServiceProvider

//該命令會在app/Providers目錄下生成ResponseMacroServiceProvider
<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}
//初始檔案格式如上

 修改實現

<?php
namespace App\Providers;

use Carbon\Carbon;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Response;
use App\Library\Error;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //error
        Response::macro('fail', function ($err_code, $result=null, $msg='') {
            if (is_null($result)){
                $result = [];
            }
            if ($msg) {
                $err_msg = $msg;
            } else {
                $err_msg = Error::errMsg($err_code);
            }
            $response_data = [
                'code' => $err_code,
                'message' => $err_msg,
                'timestamp' => Carbon::now()->timestamp
            ];
            app('log')->error(sprintf('params [%s] response [%s]',
                json_encode(request()->all(), JSON_UNESCAPED_UNICODE),
                json_encode($response_data, JSON_UNESCAPED_UNICODE)
            ));
            return Response::json($response_data);
        });

        //正常返回
        Response::macro('success', function ($result=null) {
            if (is_null($result)){
                $result = [];
            }
            $response_data = [
                'code' => 100,
                'content' => $result,
                'timestamp' => Carbon::now()->timestamp
            ];

            app('log')->debug(sprintf('params [%s] response [%s]',
                json_encode(request()->all(), JSON_UNESCAPED_UNICODE),
                json_encode($response_data, JSON_UNESCAPED_UNICODE)
            ));
            return Response::json($response_data);
        });
    }
}

 App\Library\Error的實現

<?php
/**
 * Created by PhpStorm.
 * User: shiwenyuan
 * Date: 2019/10/9 [email protected]
 * Time: 15:13
 */
namespace App\Library;

class Error
{
    public static function errMsg($code)
    {
        $maps = static::getErrs();
        return isset($maps[$code]) ? $maps[$code] : '未知錯誤';
    }

    public static function getErrs()
    {
        return [
            '500' => '伺服器錯誤',
        ];
    }
}

 在全域性服務提供者map中加入自己寫的響應服務提供者

檔案位置config/app.php

 測試

 增加測試路由

檔案路徑:routes/api.php

Route::get('test_success', '[email protected]');
Route::get('test_fail', '[email protected]');

 增加測試實現

<?php

namespace App\Http\Controllers;

class IndexController extends Controller
{
    public function testSuccess()
    {
        return response()->success(['username'=>'shiwenyuan']);
    }

    public function testFail()
    {
        return response()->fail(500);
    }
}

 最終結果

 success

 fail

 日誌記錄

➜  ~ cat /Users/shiwenyuan/test/test_demo/storage/logs/laravel-2019-10-09.log
[2019-10-09 07:39:02] local.DEBUG: params [{"query":"index"}] response [{"code":100,"content":{"username":"shiwenyuan"},"timestamp":1570606742}]  
[2019-10-09 07:39:05] local.ERROR: params [{"query":"index"}] response [{"code":500,"message":"伺服器錯誤","timestamp":1570606745}]  

原文出處 https://shiwenyuan.github.io/post/ck1irc5v...

原創不易,轉載請註明出處