我在Laravel中有一个典型的存储库模式结构。以Fruits模型为例:
类EloquentFruitRepository
,该类扩展实现FruitRepositoryInterface
的抽象EloquentRepository
。
CCD_ 4扩展了CCD_。
最后,RepositoryInterface
定义了all
、find
、with
、create
等通用/共享方法。
我已经阅读了Laravel 5中关于Repository Pattern的所有内容。我审查了所有的GitHub项目,并审查了所有关于它的注册表。。。我很担心。
我喜欢只使用叙事方法的方法,如果我的水果模型应该放在EloquentFruitRepository
中。
所以在我的控制器中,而不是构建像这样的东西
$fruits = $this->fruitRepository
->where('color', '=', 'yellow')
->where('is_available', '=', true)
->with(['comments'])
->orderBy([
'sweetness' => 'asc'
])
->all();
只做更好吗
$fruits = $this->fruitRepository
->getAvailableYellowFruitsWithPeopleCommentsOrderedBySweetness();
然后在CCD_ 12中定义该方法,如:
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();
}
所以,一般来说,所有这些通用方法应该只在特定的有说服力的存储库中使用吗?或者在控制器中也使用它们可以吗?
目前这两种方式都有效。我问的是最佳实践,而不是任何人的偏好。
我们应该只在控制器中使用叙述方法吗
感谢您的反馈。
您正在寻找"非常最佳"的实践,但正如您所知,当涉及到设计模式时,并没有一个通用的"最佳实践"适合所有情况
话虽如此,一般规则是:当您在应用程序的多个点中需要查询时,将其放入存储库中。如果你只需要一次,那就由你决定
我也会把它放在存储库中,但我会用一个更短、更可读的名称来命名这个方法,即:getAvailableYellowFruits
。对我来说,"with"one_answers"order by"部分可以忽略不计,如果你愿意,你可以随时将这些信息放在方法的注释中