这是添加过滤的正确方法吗?

时间:2018-08-03 12:33:31

标签: php laravel eloquent

我的索引/着陆/主页显示了我的图像表中的所有图像,最新的提交位于顶部。我正在考虑通过以下方式添加过滤器:

  1. 使用<a>www.domain.com/hot之类的URL添加www.domain.com/trending元素。

  2. 使我的家庭路线Route::get('/', 'PagesController@index')->name('home');具有一个可选参数,例如Route::get('/{filter?}', 'PagesController@index')->name('home');

  3. 基于可选参数,我将向视图发送不同的$ images变量:

    public function index($filter){
        if ($filter == 'hot') {
            $images = hot images;
        } else if ($filter == 'trending') {
            $images = get trending images;
        } else {
            $images = Image::orderBy('created_at', 'desc')->get();
        }
        return view('home', ['images' => $images]);
    }
    

    我还没有使用真实的代码来获取热门图像和趋势图像,因为我还没有弄清楚如何确定图像是热门图像还是趋势图像,但是您明白了。

这是创建过滤的正确方法吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可能希望使用switch语句使事情保持整洁。

   switch($filter) { 
     case 'hot'     : $images = hot images;break;
     case 'trending': $images = get trending images;break;
     default        : $images = Image::orderBy('created_at', 'desc')->get();
   }

如果希望使其更易于管理,则可以选择一个数组,支持代码使用$object->{variable with string}()方法动态地访问该函数,以搜索要调用的正确方法。

将新项目添加到数组时,仅需提供提供方法和数组条目'newest' => 'getNewestImages',

private $image_getters = [
       'hot' => 'getHotImages',
       'trending' => 'getTrendingImages',
   ];

   public function index($filter)
   {
        $images = $this->getImages();
        return view('home', ['images' => $images]);
   }

   protected function getImages($filter) 
   {
        if(array_key_exists($filter, $this->image_getters)) {
            $getter = $this->image_getters[$filter];
            $images = $this->{$getter}();
       }
       else {
            $images = Image::orderBy('created_at', 'desc')->get();
       }
       return $images;
   }