在Laravel5.2中设计一个RESTfulAPI,使用概念上可以包含其他资源的资源

在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

首先,我真的不太熟悉REST实践,我对问题的标题也不是很有信心

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

  • 带有
    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);
        }
    }
    
<>强>我的问题是我应该考虑什么作为我的资源?< /强>

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

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

这种方法的“问题”在于(让我们这样说)我最终得到了两种不同类型的资源:员工的联系人和董事会办公室的联系人,它们包含的信息略有不同,我还需要有不同的创建和编辑表单来与这两种“类型”的资源交互

为了实现REST API,我考虑了两种不同的场景:

  • 使用两个不同的RESTful控制器,一个
    EmployeeContacts
    和另一个
    OfficesContacts
    用于从概念上将资源与员工和办公室的资源分开,并通过不同的URI访问它们,如:

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

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

    example.com/phonebook/employees/create

    等等

  • 使用单个RESTful控制器,例如
    电话簿联系人
    ,通过与一个资源相同的URI访问资源(即员工和办公室的联系人资源现在都被视为“联系人”资源

    //这指的是联系人资源,可以是办公室的联系人,也可以是员工的联系人

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

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

    example.com/phonebook/contact/

    然后在控制器的
    create/store/edit/update
    方法中使用条件语句来分别处理它们(例如,如果http POST请求包含
    description\u id
    则它是一个办公室联系人并执行此操作,或者如果它有
    员工id
    则它是一个员工的联系人并执行此操作…)

  • 我想听听你的观点,在我的电话簿应用程序中,你认为这两种不同的情景会更好吗?最好考虑一个“联系人”资源,并使用控制器中具有不同回报的条件语句来处理它,还是将“联系人”的概念与“员工联系人”和“办公室联系人”分开,并使用单独的控制器和URI来处理它们


    还有其他方法可以替代吗?

    出于速度和响应性的简单原因,我会使用两个不同的控制器。加载所有联系人和筛选并不像只加载一个部分那么快

    但是,您始终可以在控制器中使用不同的数据设置相同的返回。例如
    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-要么是
    员工
    ,要么是
    董事会
    或者
    未来的某件事
    ),对我来说很好,并且很适合其他人

    希望这件事能为你澄清

    [编辑]

    我相信