不确定这是特定于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。
答案 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
端点的用例就是这样。
在回答有关如何创建驱动程序的问题时,我将考虑以下用例;
POST /drivers
POST /cars/{carId}/drivers
POST /drivers
对于POST /drivers
端点,您将使用DriverController
并将您的Driver
信息传递给store
方法。 store
方法中的验证规则将允许可选的car_id
参数作为请求的一部分。这样一来,您就可以在创建时将driver
与car
关联起来。
对于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分钟的时间有点长,但值得一看。