在Laravel 5.x中使用Repository Pattern时,我们应该只在控制器中使用叙述方法吗


Should we use only narrative methods in controllers when using Repository Pattern in Laravel 5.x?

我在Laravel中有一个典型的存储库模式结构。以Fruits模型为例:

EloquentFruitRepository,该类扩展实现FruitRepositoryInterface的抽象EloquentRepository

CCD_ 4扩展了CCD_。

最后,RepositoryInterface定义了allfindwithcreate等通用/共享方法。

我已经阅读了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"answers"order by"部分可以忽略不计,如果你愿意,你可以随时将这些信息放在方法的注释中