在Laravel 5.2中设计一个RESTful API,使用一个概念上可以包含其他资源的资源。

9 浏览
0 Comments

在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,我考虑了两种不同的情况:

  1. 使用两个不同的RESTful控制器,一个是EmployeeContacts,另一个是OfficesContacts将资源在概念上分为员工和办公室的资源,并通过不同的URI访问它们,例如:

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

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

    example.com/phonebook/employees/create

    等等...

  2. 使用一个单独的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来处理它们?

是否有其他方法我可以跟随?

0
0 Comments

在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的目的是将契约与实现分离。

我并没有混淆,正如我所说,我误读了文本。我原以为他试图在视图中进行筛选,而不是在控制器中。我已经相应地修改了答案。

0
0 Comments

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应用程序。

0