Restful 风格的设计在多个资源控制器时,如何与控制器、方法对应?

Laravel 的资源控制器在只有 1 个控制器时,很好理解,大概是这样的:

GET /photos 对应的是 PhotoControllerindex 方法,获取所有照片

GET /photos/{photo} 对应的是 PhotoControllershow 方法,获取单张照片


现在如果多出一个控制器 CategoryController

GET /categories 对应的是 CategoryControllerindex 方法,获取所有分类

GET /categories/{category} 对应的是 CategoryControllershow 方法,获取单个分类


我如果要获取分类 1 下的所有照片,按照 Restful Api 的设计:

路由是 /categories/1/photos

此时这个路由应该对应 CategoryControllergetPhotos 方法

还是对应 PhotoControllergetPhotos 方法?


如果对应 PhotoControllergetPhotos 方法,是不是可以设计成 photos?category=1 更合适?

这样的话,PhotoController 就不需要 getPhotos 方法了,直接就对应 index 方法,然后在index 方法里根据 category 参数进行筛选照片即可。

以上情况应该如何选择?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
AloneUtopia

个人感觉在你项目的业务中对照片的进行筛选条件场景不多且不复杂的情况下,使用你 PhotoController 中的 index 获取指定分类的照片就够了。

4年前 评论
Epona

严格的Restful API设计的话应该只有7个方法。针对/categories/1/photos这个,应该是CategoryPhotoController@index。不过,根据你的例子,我可能会更喜欢photos?category=1这个方法

4年前 评论

如果严格按照 Restful API 设计风格。就应该使用 /categories/1/photos ,对应 CategoryController@getPhotoByCategoryId 分类为 1 下的所有照片。

// 对应的 route
route::get('/categories/{categoryId}/photos',  'CategoryController@getPhotoByCategoryId');
// 对应的 Controller 的 function

public function getPhotoCategoryId(int $categoryId)
{
}
4年前 评论

@AloneUtopia 我的实际项目筛选条件有很多,例如还可以筛选用户,标签等等,并且返回参数格式也不是固定的,对于这种筛选条件多的情况是不是应该和筛选条件的控制器对应?例如筛选分类的照片就应该对应 CategoryControllergetPhotos 方法,筛选用户的照片就应该对应 UserControllergetPhotos 方法......还是说始终用 PhotoControllerindex 方法,然后用 index 判断参数,调用 Service 类中的不同方法?

4年前 评论
AloneUtopia

在开发中我也偶尔疑惑过这类问题,我目前的应对方式是 在数据返回格式相同且字段差异不大的情况还是使用 PhotoControllerindex方法 并且调用Service中的同一个方法,在此方法中查询时通过使用这种闭包条件子句

->when($param, function ($query) use ($param) {
        return $query->where('xxxx', $param);
}

来实现不同的条件参数查询。有个别返回参数和格式比较特殊的我会在PhotoController中创建对应的新方法。
个人习惯,且感觉很不优雅.....

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!