REST API一对多资源关系最佳实践

时间:2016-05-06 13:44:12

标签: api rest design-patterns restful-architecture api-design

让我说我在这里有一对多的关系:
每个客户都有许多信用卡

信用卡的API端点:
GET / customers / {customer_id} / cards / {card_id}
GET / customers / {customer_id} / cards
POST / customers / {customer_id} / cards
PATCH / customers / {customer_id} / cards / {card_id}
DELETE / customers / {customer_id} / cards / {card_id}

卡相关操作的5种方法:
1.获得客户卡片 2.获取客户的所有卡片 3.为客户创建一张卡片 4.更新客户的“卡片”详细信息 5.删除客户的卡片  
我的API架构分层使用 controller - >服务 - >存储库
有:
CustomersController,CustomersService,CustomersRepository,CardsService,CardsRepository。

我的问题是,我应该将每种方法放在与卡相关的操作中,以及控制器和控制器之间的关系应该如何?服务与存储库层是什么样的?

目前我这样想:
CustomersController有一个CustomersService和一个CardsService。 CardsService有一个CustomersRepository和CardsRepository(像往常一样通过构造函数注入)。以上所有5种方法都存在于CardsService中。 CardsService中CustomersRepository的目的是从我的数据库中检索条带客户ID,这样我也可以在Stripe上执行相同的操作。

根据最佳做法,这种方法是否正确?或者我应该将5个方法放在CustomersService中,而不是完全不使用CardsService?
 
对此最好的解决方案是什么?

其他信息:
- 我使用PHP和Laravel框架,并使用Stripe作为支付平台

1 个答案:

答案 0 :(得分:0)

根据发布的Rest apis,我认为没有客户就不能存在卡片。因此,其余资源应命名为 CustomersResource ,并且所有上述其他api应存在于此类中。

此课程将同时注入 CustomerService CardService 实例。

您需要做的下一个更改是删除对CardService的CustomerRepository依赖关系,因为它违反了单一责任原则

简单地说,客户服务应该处理与客户相关的操作,卡服务应该处理与卡相关的操作。不要混合这两种。

如果您需要使用其卡信息构建客户对象,请从其余资源编排对客户服务和卡服务的调用,并将其发送回用户。

希望它有所帮助。