在Laravel 5.2中设计一个RESTful API,使用一个概念上可以包含其他资源的资源。
在Laravel 5.2中设计一个RESTful API,使用一个概念上可以包含其他资源的资源。
首先,我对REST实践并不太熟悉,对于我的问题标题也不是很自信。
因此,我正在尝试使用Laravel构建一个RESTful API,用于电话簿应用程序。电话簿可能包含员工(即真实人员)或办公室的电话。因此,我有三个模型:
- 一个带有id和name字段的Directorate(主管)
- 一个带有id和name字段的Employee(员工)
- 一个带有id、tel、employee_id、directorate_id、description和type字段的Telephone(电话)
与主管办公室对应的电话只设置了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)的概念作为资源。一个联系人(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来处理它们?
是否有其他方法我可以跟随?
在Laravel 5.2中设计一个RESTful API,使用一个概念上可以包含其他资源的资源。我们可以使用两个不同的控制器来完成这个需求,因为这样做的一个简单原因是速度和响应性。加载所有联系人并进行筛选不如只加载一个部分快。不过,你始终可以在控制器中设置相同的返回,但数据不同。比如EmployeeController
返回view('contacts.index', compact('employeeContacts'))
,而OfficesController
返回view('contacts.index', compact('officesContacts'))
。
对不起,我误读了...我以为你想在视图中进行筛选。无论如何,我个人的做法是分开处理,因为这样的代码更清晰。如果你想让整个REST更易读,可以将这两个资源放在一个组中,如:Route::group(['prefix' => 'contact'], function(){ //routes here// });
。
现在你将有如下路由:
example.com/contact/employees/ example.com/contact/offices/
能否请你进一步解释一下“加载所有联系人并进行筛选不如只加载一个部分快”是什么意思?我的意思是,使用一个控制器加载只想要的部分数据不可行吗(例如,对于员工联系人,可以这样做:$employees = Employee::whereHas('telephones', function ($query) { $query->where('description_id', null); }) ->with([ 'telephones' => function ($query) { $query->where('description_id', null); } ]) ->get();然后只返回这部分数据给视图)?
你混淆了实现和API设计。这完全是两码事。API的结构与速度或响应性无关。这些与实现有关。API的目的是将契约与实现分离。
我并没有混淆,正如我所说,我误读了文本。我原以为他试图在视图中进行筛选,而不是在控制器中。我已经相应地修改了答案。
Laravel是一个流行的PHP框架,用于构建Web应用程序。在这个问题中,提到了使用Laravel 5.2设计一个RESTful API的问题,该API可以包含其他资源。下面是问题的原因和解决方法:
原因:
这个问题的原因是作者对Laravel不太熟悉,但由于这个问题涉及到REST的概念,作者还是尝试回答了问题。在构建RESTful应用程序时,应该将其他资源视为机器而不是人类。作者认为,使用不同的URL来执行不同的操作(对联系人执行CRUD操作,可以是Employee、Directorate或SomethingElseInTheFuture)是合适的,并且符合REST的规范。
解决方法:
根据作者的回答,解决方法是使用不同的URL来表示不同的资源,并根据不同的URL执行相应的操作。作者认为,这样做更符合REST的规范,并且对于项目的现在和将来都更方便。作者建议使用两个不同种类的资源来构建应用程序,并对它们分别进行CRUD操作。
Laravel是一个流行的PHP框架,用于构建Web应用程序。在设计一个RESTful API的过程中,有一个问题是如何在Laravel 5.2中使用资源来表示其他资源。虽然作者对Laravel不太熟悉,但是由于这个问题涉及到REST的概念,所以作者还是尝试回答了问题。
在构建RESTful应用程序时,需要将其他资源视为机器而不是人类。这意味着我们应该根据不同的URL来执行不同的操作,而不是根据URL来决定执行何种操作。这样做更符合REST的规范。
作者建议使用不同的URL来表示不同的资源。例如,可以使用两个不同的RESTful控制器来分别处理服务联系人和员工联系人。这样做有助于保持代码的清晰和可维护性。同时,通过使用不同的URL和资源,可以更好地满足项目的需求,无论是现在还是将来。
总之,设计一个RESTful API需要遵循REST的规范,并根据不同的资源使用不同的URL来执行不同的操作。这样做有助于保持代码的清晰和可维护性,并且更好地满足项目的需求。Laravel是一个强大的框架,可以帮助我们构建高效和可扩展的RESTful应用程序。