我在Laravel中有一个典型的存储库模式结构。以水果模型为例我有:
类EloquentFruitRepository
扩展了实现EloquentRepository
的抽象FruitRepositoryInterface
。
FruitRepositoryInterface
延伸RepositoryInterface
。
最后RepositoryInterface
定义了all
,find
,with
,create
等通用/共享方法。
我已经阅读了Laravel 5中关于Repository Pattern的所有内容。我回顾了所有GitHub项目,并回顾了所有关于这一点的要点......我很关注。
我喜欢使用叙事方法的方法,如果我的Fruit模型应该放在EloquentFruitRepository
中。
所以在我的控制器中,而不是像以下那样构建:
$fruits = $this->fruitRepository
->where('color', '=', 'yellow')
->where('is_available', '=', true)
->with(['comments'])
->orderBy([
'sweetness' => 'asc'
])
->all();
最好只做
$fruits = $this->fruitRepository
->getAvailableYellowFruitsWithPeopleCommentsOrderedBySweetness();
然后在EloquentFruitRepository
中定义该方法,如:
public function getAvailableYellowFruitsWithPeopleCommentsOrderedBySweetness(): Collection
{
$model = $this->makeModel();
$model
->where('color', '=', 'yellow')
->where('is_available', '=', true)
->with(['comments'])
->orderBy([
'sweetness' => 'asc'
]);
return $model->get() ?? new Collection();
}
一般来说,所有这些泛型方法是否只能在特定的雄辩存储库中使用,还是在控制器中也可以使用它们?
目前两种方式都有效。我问的是最好的(最好的)练习,而不是任何人的偏好。
我们应该只在控制器中使用叙述方法吗?
感谢您的反馈。
答案 0 :(得分:2)
您正在寻找最好的'但是,正如您可能知道的那样,在涉及设计模式时,并不是一般的“最佳实践”。适合所有情况
话虽如此,一般规则是:当您需要在应用程序的多个点上进行查询时,将其放入存储库中。如果你只需要它一次就需要它
我也把它放在一个存储库中,但是我用一个更短更易读的名称命名该方法,即:getAvailableYellowFruits
。对我来说'与'和'按顺序排列部分可以忽略不计,如果你想要,你总是可以把这些信息放在方法的评论中