如何根据存储库模式检索自定义的记录列表?

时间:2014-11-26 14:00:34

标签: laravel repository-pattern

我想将业务逻辑移出控制器操作。我在laravel中阅读了很多关于存储库模式的内容,并附有大量示例。

然而,它们通常非常简单 - 我们有一个类使用一些存储库来获取所有可能记录的列表,数据返回到控制器并传递给视图。

现在如果我们的列表不是所有可能的记录怎么办?如果它取决于很多东西怎么办?例如:

  • 我们将列表显示为“页面”,因此我们可能需要第Y页的X记录
  • 我们可能需要过滤列表,甚至应用多个过滤器(状态,作者,日期等等)
  • 用户可以更改数据的排序(例如,通过单击表格列标题)
  • 我们可能需要来自其他数据源(连接表)的一些数据,或者它甚至可能用于排序(因此延迟加载不起作用)

我是否应该考虑所有这些案例的特殊方法?这样的事情:

public function getForDisplay(
    $with = array(), 
    $filters = array(), 
    $count = 20, 
    $page = 0, 
    $orderBy = 'date', 
    $orderDir = 'DESC'
)
{
    //all the code goes here

    return $result;
}

然后从我的控制器那样调用它:

$orders = $this->orders->getForDisplay(
    array('customer', 'address', 'seller'), 
    Input::get('filters', array()), 
    20, 
    Input::get('page', 0), 
    Input::get('sort', 'date'), 
    Input::get('direction', 'DESC')
);

这看起来已经错了,我们甚至没有进入存储库。

解决此类情况的最佳/正确做法是什么?我非常确定必须有一种方法来实现所需的结果,而不会将所有可能的组合添加为方法参数。

1 个答案:

答案 0 :(得分:1)

仅使用存储库模式进行业务模型更新,您最终会得到非常具体的查询方法(域通常不需要很多查询,而且非常简单)。对于UI /报告查询,您可以使用简单的DAO / Service / ORM / Query Handler,它将获取一些输入并返回所需的数据(至少是视图模型的一部分)。

由于您已经在使用ORM,因此可以直接使用它。请注意,您也可以使用ORM进行域更新,但在存储库的实现中,即应用程序只能看到存储库接口。我们关心业务层的分离,对于UI查询,您可以跳过不必要的抽象。

不过,因为我们谈论的是设计,所以一切都是主观的,因此,没有一种最佳/最佳的做事方式。