如何在对象中正确包装JSON数据库结果


How to properly wrap a JSON database result within an object

我使用Laravel资源控制器为我的各种SPA创建了一个API,它像一个魅力一样工作。虽然BackboneJS对默认JSON响应没有问题,但EmberJS希望结果包装在一个单数和复数命名的JSON对象中,这取决于它是获取单个模型还是模型集合。

我已经知道的

  • 将JSON结果转换为数组包装并将其转换回JSON
  • 将每个结果包装在对象中。
  • 将数据库调用的结果更改为包含setFetchMode(PDO::FETCH_ASSOC);的数组


如何正确地(使用最便宜的过程)创建包装JSON响应,所以没有JSON,数组或对象之间来回转换的结果?

来自Laravel资源控制器的一个片段:

<?php
class ResourceController extends Controller {
     ...
     /**
        * Display a listing of the resource.
        *
        * @return Response
        */
     public function index() {
            return Model::all();
     }

     /**
        * Display the specified resource.
        *
        * @param  int  $id
        * @return Response
        */
     public function show($id) {
            return Model::find($id);
     }
     ...
}

这将把一个数据库配置为"fetch" => PDO::FETCH_CLASS的Laravel应用程序的原始Eloquent数据库结果包装起来。它创建了一个新的Illuminate'Database'Eloquent'Collection对象,并将Eloquent结果包装在models属性中。这样就可以正确地格式化它,以便与Ember数据一起使用,而无需进行任何转换。

/**
 * Display a listing of the resource.
 *
 * @return Response
 */
public function index() {
   $index = new Illuminate'Database'Eloquent'Collection;
   $index['models'] = Model::all();
   return $index;
}

您可以使用以下结构来做到这一点。总是以包装格式返回json响应,如(我假设您有用户模型);

{
    "user": [
        {"name": "Hüseyin"},
        {"surname": "BABAL"},
        {"title": "Software Developer"}
    ]
}

这适用于ember.js。对于backbone.js,您需要做一些额外的简单工作,如:

var User = Backbone.Collection.extend({
    model: User, 
    url: '/api/userInfo',
    parse: function(response) {
            return response.user;
        });
    }
});

通过这样做,您将只有一个格式rest服务,并且您只需要为backbone.js

做一些额外的工作。

更新:

想想index动作,你可以这样做;

public function index() {
    return Response::json(array("user" => Model::all()));
}

结果将用"user"包装,您可以在前端使用响应作为json。结果将是;

{
    "user": [
        {...},
        {...}
    ]
}