2

我正在开发一个图片库 Web 应用程序。它有很多访问路径,它们都应该以相同的方式渲染画廊,唯一的区别是图片的顺序。

例如:

mysite.com/favorites -> shows all the pics ordered by number of favorites
mysite.com/views -> shows all the pics ordered by number of views
mysite.com/date -> shows all the pics ordered by date
mysite.com/votes -> shows all the pics ordered by votes

由于所有这些动作在它们之间如此相似,在控制器上为每个路由定义一个动作并将顺序作为参数传递是一种好习惯吗?或者这个逻辑应该在模型中处理?

4

1 回答 1

2

如果动作非常相似以至于与参数不同,那么让一个动作接受该参数可能是有意义的。最后一个不是规则,只是偏好。

在您的特定情况下,您可以通过使用带参数的一条路线按如下方式处理它:

Route::get('{orderBy}', 'GalleryController@showPics')

然后在您的控制器中,您将拥有以下内容:

class GalleryController extends BaseController
{
    public function showPics($orderBy)
    {
        $pics = $this->service->getPics($orderBy);
        return View::make('gallery')->with('pics', $pics);
    }
}

虽然它可以正常工作,但有几点需要考虑:

  1. 具有专门操作的控制器更具语义,即: showFavoritesshowMostViewedshowRecentsshowMostVoted
  2. 想想。如果您计划提供不同的视图、不同的嵌套子级和不同的数据集,最好对每个案例都有一个操作。
  3. 代码可读性。想象一下控制器有几个 if 语句,几个 return 语句,所有这些都包裹在一个有多个 catch 子句的大 try-catch 块中......如果你可以用意大利面条代码避免下一个程序员的大脑失误,考虑一下。
于 2013-08-12T20:16:00.607 回答