【问题标题】:Laravel 5 - Customize JSON response on a Rest API serverLaravel 5 - 在 Rest API 服务器上自定义 JSON 响应
【发布时间】: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 中解决了这个问题?

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

谢谢。

【问题讨论】:

    标签: php json laravel-5


    【解决方案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 内置的东西......谢谢您的关注
      猜你喜欢
      • 2016-01-17
      • 2018-11-08
      • 2018-12-25
      • 2016-03-17
      • 1970-01-01
      • 2016-04-22
      • 2014-07-04
      • 2021-01-30
      • 2018-06-17
      相关资源
      最近更新 更多