龙行博客

走路看风景,经历看人生,岁月留痕迹,人生留轨迹,17的历史,18的豪情,时间的匆忙,人生的风景,放开心胸往前走,成功再远行,放开理想往前走,梦想再行动。
现在位置:首页 > 编程语言 > PHP > Laravelapi 自定义 response 格式

Laravelapi 自定义 response 格式

龙行    PHP    2020-9-7    2147    0评论    

http 路由



laravel 的 http 路由文件有两个 api.php 和 web.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 13341007105@163.com
* 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', 'IndexController@testSuccess');
Route::get('test_fail', 'IndexController@testFail');

增加测试实现

<?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

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}]  



评论一下 分享本文 赞助站长

赞助站长X

扫码赞助站长
联系站长
龙行博客
  • 版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
  • 本文网址:https://www.liaotaoo.cn/379.html
  • 上篇文章:Swoole与WebSocket如何即时通讯,实现弹幕效果?
  • 下篇文章:nginx常用命令
  • Laravel
快捷导航
联系博主
在线壁纸
给我留言
四四五五
音乐欣赏
返回顶部