Restful 风格的设计在多个资源控制器时,如何与控制器、方法对应?
Laravel 的资源控制器在只有 1 个控制器时,很好理解,大概是这样的:
GET /photos 对应的是 PhotoController 的 index 方法,获取所有照片
GET /photos/{photo} 对应的是 PhotoController 的 show 方法,获取单张照片
现在如果多出一个控制器 CategoryController
GET /categories 对应的是 CategoryController 的 index 方法,获取所有分类
GET /categories/{category} 对应的是 CategoryController 的 show 方法,获取单个分类
我如果要获取分类 1 下的所有照片,按照 Restful Api 的设计:
路由是 /categories/1/photos
此时这个路由应该对应 CategoryController 的 getPhotos 方法
还是对应 PhotoController 的 getPhotos 方法?
如果对应 PhotoController 的 getPhotos 方法,是不是可以设计成 photos?category=1 更合适?
这样的话,PhotoController 就不需要 getPhotos 方法了,直接就对应 index 方法,然后在index 方法里根据 category 参数进行筛选照片即可。
以上情况应该如何选择?
关于 LearnKu
个人感觉在你项目的业务中对照片的进行筛选条件场景不多且不复杂的情况下,使用你
PhotoController中的index获取指定分类的照片就够了。严格的Restful API设计的话应该只有7个方法。针对
/categories/1/photos这个,应该是CategoryPhotoController@index。不过,根据你的例子,我可能会更喜欢photos?category=1这个方法@AloneUtopia 我的实际项目筛选条件有很多,例如还可以筛选用户,标签等等,并且返回参数格式也不是固定的,对于这种筛选条件多的情况是不是应该和筛选条件的控制器对应?例如筛选分类的照片就应该对应
CategoryController的getPhotos方法,筛选用户的照片就应该对应UserController的getPhotos方法......还是说始终用PhotoController的index方法,然后用index判断参数,调用Service类中的不同方法?在开发中我也偶尔疑惑过这类问题,我目前的应对方式是 在数据返回格式相同且字段差异不大的情况还是使用
PhotoController的index方法 并且调用Service中的同一个方法,在此方法中查询时通过使用这种闭包条件子句来实现不同的条件参数查询。有个别返回参数和格式比较特殊的我会在
PhotoController中创建对应的新方法。个人习惯,且感觉很不优雅.....