【问题标题】:How to handle removing a relationship in JSON:API?如何处理删除 JSON:API 中的关系?
【发布时间】:2018-06-05 03:52:29
【问题描述】:

我们目前正在使用 Ember 和 CakePHP 开发单页应用程序。我们使用JSON:API 格式传输数据。

但是,在创建关系时,客户端会传输 id。删除关系时,Ember 将 id 传输为null

但是在服务器端,null 是不可捕获的,所以我们使用一个额外的查询参数来指示它应该被删除。

我们如何在仍然遵守 JSON:API 规范的同时使用 CakePHP 实现这一点(捕获 null 值)?

或者,有没有其他方法可以删除与 JSON:API 规范或使用 Ember 的关系?

【问题讨论】:

  • 我不认为这是一个意见问题,因为 JSONAPI 规范很严格。 “null 不可捕获”是什么意思? JSONAPI 规范确实发送了 null,因此前端按预期工作。你有一个选择是你可以发送一个非 Ember 数据 POST 请求,该请求的格式与你的后端期望的一样。您不必一直使用 Ember Data。但是,您当前的解决方案很好,因为它不会破坏 JSONAPI 规范。
  • capture the null value 到底是什么意思?

标签: php rest cakephp ember.js json-api


【解决方案1】:

我很确定这在 PHP 方面得到了最好的解决,所以我相信其他人会更适合回答这个问题。我可以从 Ember 方面回答。

我想说的第一件事是@handlebars 在他们的评论中是正确的:重点是你不需要为每个请求都使用 ember-data 如果你不想至。

我们的意思是,您可能已经遇到过使用以下方法通过 ember-data 获取一堆模型的情况:

this.get('store').findRecord('post', 1);

而且您可能已经设置了一堆关系。如果您想删除关系并且您的后端 API 无法遵循 JSON:API specification,那么您只需创建一个特定的端点来完成这项工作。

要然后对特定端点执行DELETE 请求,您可以使用以下代码:

import Controller from '@ember/controller';
import { inject as service } from '@ember/service';

export default Controller.extend({
  ajax: service(),
  actions: {
    deleteRelationship(id) {
      this.get('ajax').request(`/posts/${id}/author`, {
        method: 'DELETE',
      });
    }
  }
});

此代码使用ember-ajax 直接调用网络。

注意:您必须非常小心这种方法。这意味着您的后端将与 ember-data 不同步,并且您必须在执行删除后立即在前端重新加载 post 模型:

store.findRecord('post', 1, { reload: true });

由于一些奇怪的同步行为,我强烈建议您更新后端以能够遵循 JSON:API 规范并接受空值以删除关系。

此外,如果您想看到我们在视频中讨论回答这个问题,您可以在此处查看 https://youtu.be/WKfq3dS73xg 和此处 https://youtu.be/ExUtgatzZeI?t=25m54s

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2015-06-17
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多