【问题标题】:BreezeJS on Durandal with PHP REST API (Laravel)Durandal 上的 BreezeJS 与 PHP REST API (Laravel)
【发布时间】:2014-08-07 11:38:59
【问题描述】:

我正在用 Durandal 2.1 编写一个 SPA。到现在为止还挺好。但是,我在选择正确的 Data Persistence 库来与我的 PHP (Laravel) REST API 进行通信时遇到了很大的困难。

Durandal 的第一大库是 BreezeJS。据说它支持 API 的 without oData / ASP.NET Entity 框架。我已经搜索了很多天,但找不到任何像样的资源来告诉我如何将 BreezeJS 与我的基本 PHP REST API 一起使用。

愿望清单如下:

  • 在视图之间保留数据
  • 验证模型
  • 状态跟踪(又名 isDirty / cancelChanges)
  • GET/POST/PUT/DELETE 使用 REST API 调用(在 PUT 的情况下,只发送脏东西)

REST API 如下。我将使用联系人 + 地址 + 国家模型结构来解释我的 API 是如何工作的。

  • 联系多对多地址
  • 地址 belongs-to 国家又名 Country 拥有许多地址

以下 GET 请求:

GET /api/v1/contacts
+ Payload:
{
    append_addresses         : 1, // add addresses as nested data
    append_addresses_country : 1, // add country as nested data of addresses
    stack                    : 2, // return no more than 2 contacts (e.g. for pagination)
    page                     : 1, // return the first page (so the first 2 contacts)
    count                    : 1  // return the total number of existing contacts
}

返回以下结果:

{
    "total": 100,
    "data": [
        {
            "id": 1,
            "name": "Turner PLC",
            "addresses": [
                {
                    "id"         : 214,
                    "country_id" : 1,
                    "city"       : "North Jason",
                    "country"    : {
                        "id"        : 1,
                        "name"      : "Canada"
                    }
                },
                {
                    "id"         : 203,
                    "country_id" : 2,
                    "city"       : "West Lafayette",
                    "country"    : {
                        "id"        : 2,
                        "name"      : "The Netherlands"
                    }
                }
            ]
        }
    ]
}

API 支持 2 种使用 POST/PUT 的方式:

  1. POST/PUT 数据的结构与上面“数据”属性下显示的结构相同。基于模型的id,后端将决定是否需要创建或更新模型。后端还会根据提供的有效负载自动检测是否需要创建/更新/删除关系。很酷吧? :-)

  2. POST /api/v1/entities...

...具有以下有效负载:

[
    {
        "type" : "Contact",
        "data" : {
            "id"   : null, // Will create a new Contact
            "name" : "Malaysia"
        }
    },
    {
        "type" : "Contact",
        "data" : {
            "id"   : 1, // Will update existing Contact
            "name" : "Turner Example"
        }
    },
    {
        "type" : "Address",
        "data" : {
            "id"          : 203, // Will update existing Address
            "city"        : "South Jason",
            "contacts_id" : [1,3,5] // Will set/update the many-to-many relationship between Address ID 203 and Contact ID 1, 3 and 5
        }
    }
]

现在我的问题是:

  1. 这可以在 BreezeJS 中完成,还是我应该考虑使用 JayData 或 Waterline 之类的替代方法?

  2. BreezeJS 似乎坚持使用类似查询的语法。我错过了它的目的还是没用?如果是这样,是否可以省略类似语法的查询并仍然使用 BreezeJS 或替代方法?

  3. BreezeJS(或替代方案)将如何处理 hasOne、hasMany、belongsTo 和 belongsToMany 以及多态关系?

  4. 是否存在与我的类似用例的“入门”?我已经阅读了很多关于 BreezeJS 及其替代品的文章,但是我还没有想到拼图的各个部分。换句话说,我完全迷失了。

【问题讨论】:

    标签: php laravel sails.js breeze waterline


    【解决方案1】:

    http://www.breezejs.com/samples 有大量示例显示使用 Breeze.js 而不使用 EF 和 OData。选择你的口味,我会推荐 Zza、Intro to SPA (Ruby)、Edmunds 或 ESPN 示例。他们都使用我记得的客户端元数据。

    就 POST 数据而言,您可以随意使用 http://www.breezejs.com/documentation/breezeajaxpostjs 之类的东西自定义 AJAX 适配器,它允许 POST 数据,并且 Breeze 仍会将结果解释为实体,因为它们处于正确的 JSON 结构中,或者您始终可以扩展当前的 AJAX 适配器 Breeze 提供您自己的增强功能,或者只使用普通的旧 AJAX 调用。真的没关系。

    请记住,Breeze 不喜欢如何您获取/设置数据,只是您这样做并使用结果更新它缓存的实体。具体回答您的问题 -

    1. 这可以在 BreezeJS 中完成,还是我应该考虑使用 JayData 或 Waterline 之类的替代方法? 我应该使用这个还是那个? - 不是一个容易回答的问题。始终为工作选择最佳工具。

    2. BreezeJS 似乎坚持使用类似查询的语法。我错过了它的目的还是没用?如果是这样,是否可以省略类似语法的查询并仍然使用 BreezeJS 或替代方法? 默认情况下,Breeze 在查询中使用语法,因为默认适配器是 WebAPI 适配器。随意使用.withParameters() 方法来创建我们自己的查询体。

    3. BreezeJS(或替代方案)将如何处理 hasOne、hasMany、belongsTo 和 belongsToMany 以及多态关系? Breeze 支持除多对多之外的所有关系和类型。不过,联结类型对象可以支持多对多关系。 http://www.breezejs.com/documentation/presenting-many-many

    4. 是否存在与我的类似用例的“入门”?我已经阅读了很多关于 BreezeJS 及其替代品的文章,但是我还没有想到拼图的各个部分。换句话说,我完全迷失了。 阅读文档并查看上面的示例。一些示例中有指向演练的链接,我是 ESPN 的作者,所以我知道它可以工作并且不关心 API 实现

    【讨论】:

      【解决方案2】:

      他说的。 (PW 卡德)

      关于在线查询语法,Breeze 使用开箱即用的 OData 语法,但可以适应更 RESTy 的语法。看看breeze.ajaxrestinterceptor.js。它转换默认的 OData 语法,例如:

      /breeze/orders/?$filter=id eq 1
      

      进入 RESTy 语法:

      /breeze/orders/1
      

      如果你想支持更丰富的查询,breeze.server.php 会为你做这件事,但它目前只支持 Doctrine ORM。你也许可以将它改编为 Laravel/Eloquent。

      还有一个demo 使用breeze.server.php,您可能想浏览一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2016-09-05
        相关资源
        最近更新 更多