我使用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": [
{...},
{...}
]
}