Laravel 5 - 在 Rest API 服务器上自定义 JSON 响应

Posted

技术标签:

【中文标题】Laravel 5 - 在 Rest API 服务器上自定义 JSON 响应【英文标题】:Laravel 5 - Customize JSON response on a Rest API server 【发布时间】:2016-05-16 09:52:25 【问题描述】:

我是 Laravel 的新手,我正在将我的应用程序从 Slim 框架迁移到 Laravel 5。 谷歌搜索我没有找到太多关于如何自定义 JSON 响应的信息。假设我有:

型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model

    protected $visible = [
        'username', 'posts',
    ]; 

控制器

<?php

namespace App\Http\Controllers;

use [...]

/* *
 *  Implicit controller
 */
class UserController extends Controller

    public function getIndex()
    
        return response()->json(User::all(), 200);
    

路线

Route::controller('users', 'UserController');

如果我想在 JSON 对象中输出该数据,例如:

"success": bool, "message": string, "data": array 
// in this case 'array' would be User::all()

?

有谁知道是否有一个库来处理这种东西?或者有没有人已经以某种方式在 laravel 中解决了这个问题?

注意我知道我可以编写一个中间件来“修改”响应,但我不确定它是否是正确的解决方案,而且检查中间件是否应该包含错误也很痛苦。

谢谢。

【问题讨论】:

【参考方案1】:

回复有点晚,但也许对其他人有帮助。

您可以通过在您的项目中创建提供程序的响应工厂来解决此问题,这里是 SuccessError 响应的示例:

<?php
// Place this file on the Providers folder of your project
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Routing\ResponseFactory;

class ResponseServiceProvider extends ServiceProvider

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot(ResponseFactory $factory)
    
        $factory->macro('success', function ($message = '', $data = null) use ($factory) 
            $format = [
                'status' => 'ok',
                'message' => $message,
                'data' => $data,
            ];

            return $factory->make($format);
        );

        $factory->macro('error', function (string $message = '', $errors = []) use ($factory)
            $format = [
                'status' => 'error', 
                'message' => $message,
                'errors' => $errors,
            ];

            return $factory->make($format);
        );
    

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    
        //
    

然后在 config/app.php 中的提供者值上添加类:

'providers' => [
    ...

    App\Providers\ResponseServiceProvider::class,
]

它已经完成了,因为提供者已经被聚合,你可以使用 response helper 调用宏来传递各自的属性。例如:

$user = User::find(1); 

if($user) 
   return response()->success('Your custom success message', $user);
 else 
   return response()->error('Your custom error message', 'Validation errors or else');

【讨论】:

【参考方案2】:

你试过了吗

return response()->json([
    'success'=>true, 
    'message'=>'string', 
    'data'=>User::all()
]);

?

【讨论】:

当然,如果我对该数组进行 json_encode 而不仅仅是 User:all() .... 这是我目前在 Slim 上使用的方法。我有一个接受数据的静态函数和错误参数,并相应地返回响应数组......我正在寻找的是 Laravel 内置的东西......谢谢您的关注

以上是关于Laravel 5 - 在 Rest API 服务器上自定义 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

Laravel REST API - 无限循环

Laravel 5.3 Rest API 登录

Laravel 5 REST API

简单的 Laravel 5 REST API

php 【Laravel】5.7 REST API设置

laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证