在Laravel(父母/孩子)关系中创建孩子的正确RESTful方法

时间:2020-10-22 16:24:18

标签: laravel rest

不确定这是特定于Laravel的,但是使用Laravel创建父母的孩子的正确RESTFUL方法是什么?例如,我有一辆可以有许多驾驶员(hasMany)的汽车,而驾驶员属于一辆汽车(belongsTo)。如果我要创建一个父级为Car#1的Driver,那么CarController.php是否有责任创建该驱动程序:/car/1/driver/create还是我要使用/driver/create/car/1并将责任保留在DriverController.php中? / p>

现在我正在做/driver/create/1(其中#1代表汽车),感觉有点不对劲,但我不清楚RESTFUL的方式。 TIA。

2 个答案:

答案 0 :(得分:0)

POST / cars / 1 / driver。 没有兴趣指定操作(创建)。方法(发布)已经做到了。

答案 1 :(得分:0)

REST中确实没有正确的方法来实现嵌套资源,因为它并不在乎。有支持和反对嵌套资源的论点,但是,有一些普遍接受的实现方式以及您决定要一致的协议。

我利用嵌套资源,但仅使用一个嵌套级别,而没有更多。例如:

GET /cars/{carId}/drivers/{driverId}

但是,我会避免以下情况:

GET /cars/{carId}/drivers/{driverId}/incidents

如果您有多个嵌套资源,请考虑通过父资源 获取嵌套资源:

GET /cars/{carId}/drivers/ // Get all drivers for the car
GET /drivers/{driverId}/incidents // Get all incidents for the driver

一目了然,嵌套的资源URL可以传达比单个资源URL更多的含义。例如

GET /cars/{carId}/drivers/{driverId} // more meaningful
GET /drivers/{driverId} // less meaningful

使用上面的第二个URL,在返回资源之前,我不知道请求的car与哪个driver关联。话虽如此,/drivers/{driverId}仍然可以适用并且有用,具体取决于您的用例。

如果您可以创建尚未与/drivers关联的新drivers,则car端点的用例就是这样。

在回答有关如何创建驱动程序的问题时,我将考虑以下用例;

  1. 创建与汽车无关的驾驶员
    • POST /drivers
  2. 创建与汽车关联的驾驶员
    • POST /cars/{carId}/drivers
    • POST /drivers

对于POST /drivers端点,您将使用DriverController并将您的Driver信息传递给store方法。 store方法中的验证规则将允许可选的car_id参数作为请求的一部分。这样一来,您就可以在创建时将drivercar关联起来。

对于POST /cars/{carId}/drivers端点,您将使用CarDriverController(或DriverController子文件夹中的Cars,如果经常看到的话)并传递您的Driver信息到store方法。请求中将不需要car_id参数,因为将从URL中传递的car获得关联的{carId}

要更新driver资源,可以遵循相同的原则,只是修改HTTP动词并创建适当的路由。

PUT /drivers/{driverId}
DriverController@update

PUT /cars/{carId}/drivers/{driverId}
CarDriverController@update

如果您决定同时使用两种方法来创建drivers,并且发现重复的代码,请考虑将其重构为服务。

更新1

对于#2 POST / cars / {carId} / drivers,商店端点是否使GET / cars / {carId} / drivers /创建创建端点?同样对于POST /驱动程序创建端点GET / drivers / cars / {carId}?

如果您正在使用刀片视图并遵循Laravel约定,则可以在driver或{{1}处找到用于为给定car创建新的GET /cars/{carId}/drivers/create的表单}。

听起来关系应该总是得到一个单独的控制器。

理想上是,因为大多数应用程序不过是CRUD,所以所有内容都可以映射到7个控制器操作之一。这样可以使事情整洁,简单,职责分开。

请看Adam Wathan的this video,其中介绍了如何将您认为是自定义动作的内容映射到7种基本Laravel动作之一。 40分钟的时间有点长,但值得一看。