gpt4 book ai didi

api - 使用概念上可以包含其他资源的资源在Laravel 5.2中设计RESTful API

转载 作者:行者123 更新时间:2023-12-02 14:15:13 25 4
gpt4 key购买 nike

首先,我确实对REST实践不是很熟悉,并且我对我的问题的标题也不是很自信。

因此,我正在尝试使用Laravel为电话簿应用程序构建RESTful API。电话簿可以包含员工(即真实人)或办公室的电话。因此,我有三种模式


具有Directorateid字段的name
具有Employeeid字段的name
具有Telephoneidtelemployee_iddirectorate_iddescription字段的type


对应于首长级办公室的电话仅设置了idteldirectorate_iddescription字段,而对应于某人(即员工)的电话仅设置了idtelemployee_iddirectorate_idtype字段。这就是我将它们分开的方式:具有描述的电话只能是办公室的电话,而同时设置了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);
}
}



我的问题是我应该考虑什么作为我的资源。

到目前为止,我正在考虑以下方法:

我将使用联系的概念作为资源。联系人可以是员工和电话的联系信息,也可以是董事会和电话的联系信息。例如,“联系人”可以包含雇员的姓名及其相关的电话号码和电话类型,也可以包含董事会名称以及电话的描述和电话号码。

这种方法的“问题”是,我最终得到了两种不同类型的资源(让我们这样说):员工的联系人和首长级办公室的联系人,它们包含的信息略有不同,因此,我还需要拥有不同的信息创建和编辑表单以与这两种“类型”的资源进行交互。

为了实现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访问资源(即,现在将员工和办公室的联系资源都视为“联系”资源)

//这是指可以是办公室或n位员工的联系人的联系人资源

example.com/phonebook/contact/{id}/edit

//这应该列出所有资源(员工和办公室联系人)

example.com/电话簿/联系人/

然后在控制器的 create/store/edit/update方法中使用条件语句分别处理它们(例如,如果一个HTTP POST请求包含一个 description_id,则它是办公室联系人并执行此操作;否则,如果有一个 employee_id则它是员工的联系方式...)


我想听听您的看法,您认为这两种不同的情况在我的电话簿应用程序的REST上下文中会更好吗?最好考虑一个单一的“联系”资源,并在控制器中使用具有不同收益的条件语句来处理它,或者将“联系”的概念分为“雇员的联系”和“办公室的联系”,并使用单独的控制器和URI处理它们?

还有其他我可以遵循的方法吗?

最佳答案

出于速度和响应速度的简单原因,我将使用2个不同的控制器来执行此操作。加载所有联系人和筛选并不像仅加载一个部分那样快。

但是,您始终可以在控制器中为不同的数据设置相同的收益。如EmployeeController@index返回view('contacts.index', compact('employeeContacts')),而OfficesController@index返回view('contacts.index', compact('officesContacts'))

编辑:

抱歉,我看错了...我认为您想在视图中进行过滤。无论如何,我的做法是单独执行此操作,仅因为代码更简洁。如果要使整个REST更具可读性,可以将这两种资源放在一个组中,如下所示:Route::group(['prefix' => 'contact'], function(){ //routes here// });
所以现在您将拥有以下路线:

example.com/contact/employees/

example.com/contact/offices/

关于api - 使用概念上可以包含其他资源的资源在Laravel 5.2中设计RESTful API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36616606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com