【发布时间】:2016-08-05 14:58:18
【问题描述】:
首先我对 REST 实践真的不是很熟悉,对我的问题的标题也不是很自信。
所以我正在尝试使用 Laravel 为电话簿应用程序构建一个 RESTful API。电话簿可能包含员工(即真人)或办公室的电话。出于这个原因,我有三个模型
-
Directorate与id和name字段, -
Employee与id和name字段和 -
Telephone与id、tel、employee_id、directorate_id、description和type字段。
一个局办公室对应的电话只设置了id、tel、directorate_id和description字段,而一个人(即员工)对应的电话只设置了id, tel、employee_id、directorate_id 和 type 字段。我就是这样区分它们的:有描述的电话只能是办公室的电话,而同时设置了employee_id和type_id的电话是员工的电话。
模型相关如下:
- 一个员工可能有很多电话
-
一个董事会,可能有很多电话
class Directorate extends Model { public function telephones() { return $this->hasMany(Telephone::class); } public function employees() { return $this->hasMany(Employee::class); } } class Employee extends Model { public function telephones() { return $this->hasMany(Telephone::class); } public function directorate() { return $this->belongTo(Directorate::class); } } class Telephone extends Model { public function employee() { return $this->belongsTo(Employee::class); } }
我的问题是我应该将什么视为我的资源。
到目前为止,我正在考虑以下方法:
我将使用 contact 的概念作为资源。 联系人可以是员工和电话的联合信息,也可以是董事会和电话的联合信息。例如,“联系人”可能包含员工的姓名及其相关的电话号码和电话类型,或者它可以包含董事会的名称以及电话的描述和电话号码。
这种方法的“问题”是我最终得到(让我们这样说)两种不同类型的资源:员工的联系人和主管办公室的联系人,其中包含的信息略有不同,因此,我还需要有不同的创建和编辑表单来与这两种“类型”的资源进行交互。
为了实现 REST API,我考虑了两种不同的场景:
-
使用两个不同的 RESTful 控制器,一个
EmployeeContacts和另一个OfficesContacts,用于从概念上将资源分为员工资源和办公室资源,并通过不同的像这样的 URI:example.com/phonebook/employees/{id}/edit
example.com/phonebook/offices/{id}/edit
example.com/phonebook/employees/create
等等……
-
使用单个 RESTful 控制器,例如
PhonebookContacts通过与一个资源相同的 URI 访问资源(即员工和办公室的联系人资源现在都被认为只是一个“联系人”资源)//这是指一个联系人资源,可以是办公室或员工的联系人
example.com/phonebook/contact/{id}/edit
//这应该列出所有资源(员工和办公室联系人)
example.com/phonebook/contact/
然后在控制器的
create/store/edit/update方法中使用条件语句来分别处理它们(例如,如果http POST 请求包含description_id,那么它是办公室联系人并执行此操作,否则如果有employee_id那么它是员工的联系人,所以这样做......)
我想听听您的意见,您认为这两种不同的场景中哪一个在我的电话簿应用程序的 REST 环境中更好?最好考虑一个“联系人”资源并使用控制器中具有不同返回的条件语句来处理它,或者我应该将“联系人”的概念与“员工的联系人”和“办公室的联系人”分开并使用单独的控制器和URI 来处理它们?
我可以采用其他方法吗?
【问题讨论】:
-
要设计 API(服务合同),您必须先咨询应用程序的要求。它的主要目的是什么?它是电话号码存储库,还是以员工和办公室数据为中心,而联系信息被视为次要问题?您计划使用哪些功能?
标签: api rest laravel restful-architecture