我想将业务逻辑移出控制器操作。我在laravel中阅读了很多关于存储库模式的内容,并附有大量示例。
然而,它们通常非常简单 - 我们有一个类使用一些存储库来获取所有可能记录的列表,数据返回到控制器并传递给视图。
现在如果我们的列表不是所有可能的记录怎么办?如果它取决于很多东西怎么办?例如:
我是否应该考虑所有这些案例的特殊方法?这样的事情:
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')
);
这看起来已经错了,我们甚至没有进入存储库。
解决此类情况的最佳/正确做法是什么?我非常确定必须有一种方法来实现所需的结果,而不会将所有可能的组合添加为方法参数。
答案 0 :(得分:1)
仅使用存储库模式进行业务模型更新,您最终会得到非常具体的查询方法(域通常不需要很多查询,而且非常简单)。对于UI /报告查询,您可以使用简单的DAO / Service / ORM / Query Handler,它将获取一些输入并返回所需的数据(至少是视图模型的一部分)。
由于您已经在使用ORM,因此可以直接使用它。请注意,您也可以使用ORM进行域更新,但在存储库的实现中,即应用程序只能看到存储库接口。我们关心业务层的分离,对于UI查询,您可以跳过不必要的抽象。
不过,因为我们谈论的是设计,所以一切都是主观的,因此,没有一种最佳/最佳的做事方式。