在Laravel5.2中设计一个RESTfulAPI,使用概念上可以包含其他资源的资源
首先,我真的不太熟悉REST实践,我对问题的标题也不是很有信心 因此,我正在尝试使用Laravel为电话簿应用程序构建一个RESTful API。电话簿可能包含员工(即真人)或办公室的电话。因此,我有三种型号在Laravel5.2中设计一个RESTfulAPI,使用概念上可以包含其他资源的资源,api,rest,laravel,restful-architecture,Api,Rest,Laravel,Restful Architecture,首先,我真的不太熟悉REST实践,我对问题的标题也不是很有信心 因此,我正在尝试使用Laravel为电话簿应用程序构建一个RESTful API。电话簿可能包含员工(即真人)或办公室的电话。因此,我有三种型号 带有id和name字段的directory 带有id和name字段和 带有id、tel、employee\u id、directional\u id、description和type字段的电话 与董事会办公室相对应的电话仅设置了id、tel、directional\u id和descr
- 带有
和id
字段的name
directory
- 带有
和id
字段和name
- 带有
、id
、tel
、employee\u id
、directional\u id
和description
字段的type
电话李>
id
、tel
、directional\u id
和description
字段,而与个人(即员工)相对应的电话仅设置了id
、tel
、employee\u id
、directional\u id
,和类型
字段。我就是这样把它们分开的:有描述的电话只能是办公室的电话,而同时有员工id和类型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); } }
EmployeeContacts
和另一个OfficesContacts
用于从概念上将资源与员工和办公室的资源分开,并通过不同的URI访问它们,如:
example.com/phonebook/employees/{id}/edit
example.com/phonebook/offices/{id}/edit
example.com/phonebook/employees/create
等等电话簿联系人
,通过与一个资源相同的URI访问资源(即员工和办公室的联系人资源现在都被视为“联系人”资源)
//这指的是联系人资源,可以是办公室的联系人,也可以是员工的联系人
example.com/phonebook/contact/{id}/edit
//应列出所有资源(员工和办公室联系人)
example.com/phonebook/contact/
然后在控制器的create/store/edit/update
方法中使用条件语句来分别处理它们(例如,如果http POST请求包含description\u id
则它是一个办公室联系人并执行此操作,或者如果它有员工id
则它是一个员工的联系人并执行此操作…)还有其他方法可以替代吗?出于速度和响应性的简单原因,我会使用两个不同的控制器。加载所有联系人和筛选并不像只加载一个部分那么快 但是,您始终可以在控制器中使用不同的数据设置相同的返回。例如
EmployeeController@index
返回视图('contacts.index',压缩('employeeContacts'))
和OfficesController@index
返回查看('contacts.index',压缩('officecontacts'))
编辑:
对不起,我看错了…我以为你想在视图中进行过滤。无论如何,我的做法是分开做,因为代码更干净。如果您想使其余部分更具可读性,可以将这两个资源放在一个组中,如下所示:Route::group(['prefix'=>'contact'],function(){//routes here/})代码>
因此,现在您将有如下路线:
example.com/contact/employees/
example.com/contact/offices/
我对Laravel一点也不熟悉,但因为这个问题是关于REST概念的(我有一个关于这些的小背景),所以我应该尝试一下
既然你正在建造一个安静的应用程序,你就不能把其他人看成是人,而只是作为机器。在我看来,URL应该决定将要执行的操作。因此,通过使用不同的URL来执行不同的操作(对联系人执行CRUD-要么是员工
,要么是董事会
或者未来的某件事
),对我来说很好,并且很适合其他人
希望这件事能为你澄清
[编辑]
我相信