【问题标题】:How to properly wrap a JSON database result within an object如何在对象中正确包装 JSON 数据库结果
【发布时间】:2014-05-09 07:14:56
【问题描述】:

我使用 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);
     }

     ...

}

【问题讨论】:

  • 您可以在服务器端使用包装格式,并为backbone.js 做额外的工作。以我的回答here 为例

标签: php rest backbone.js ember.js laravel-4


【解决方案1】:

这将为 Laravel 应用程序包装原始的 Eloquent 数据库结果,该应用程序的数据库配置为 "fetch" =&gt; PDO::FETCH_CLASS。它创建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;
}

【讨论】:

    【解决方案2】:

    您可以使用以下结构来做到这一点。始终以包装格式返回您的 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;
            });
        }
    });
    

    通过这样做,你将只格式化一个休息服务,你只需要为backbone.js做一些额外的工作

    更新:

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

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

    结果会被"user"包裹,你可以在前端使用response作为json。结果将是;

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

    【讨论】:

    • 嘿Huseyin,这实际上是我在问题中提供的。我需要知道如何使用 Laravel (PHP) 以优雅的方式包装结果。你写的我已经有了,因为我写的它就像 BackboneJS 的魅力。
    • @sidneydobber 您能否在有关在控制器上返回 json 部分的问题中说明您的代码?我可以帮你很好
    • 感谢您的回答,但这已经在进行 JSONarrayJSON 的转换。正如我在问题中所说,这正是我要解决的问题。
    • @sidneydobber 抱歉,我错误地添加了toArray()。在 laravel4 中,如果你返回模型,laravel 会检测到它是 json,或者是数组。您可以同时使用两者。默认,它是一个数组。我已将该数组放入已包装的数组中,然后进行了数组到 json 的转换。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多