在Laravel 5.x中使用Repository Pattern时,我们是否应该仅使用控制器中的叙述方法?

时间:2016-05-11 01:06:26

标签: php laravel design-patterns laravel-5 repository-pattern

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

EloquentFruitRepository扩展了实现EloquentRepository的抽象FruitRepositoryInterface

FruitRepositoryInterface延伸RepositoryInterface

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

我已经阅读了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();
}

一般来说,所有这些泛型方法是否只能在特定的雄辩存储库中使用,还是在控制器中也可以使用它们?

目前两种方式都有效。我问的是最好的(最好的)练习,而不是任何人的偏好。

我们应该只在控制器中使用叙述方法吗?

感谢您的反馈。

1 个答案:

答案 0 :(得分:2)

您正在寻找最好的'但是,正如您可能知道的那样,在涉及设计模式时,并不是一般的“最佳实践”。适合所有情况

话虽如此,一般规则是:当您需要在应用程序的多个点上进行查询时,将其放入存储库中。如果你只需要它一次就需要它

我也把它放在一个存储库中,但是我用一个更短更易读的名称命名该方法,即:getAvailableYellowFruits。对我来说'与'和'按顺序排列部分可以忽略不计,如果你想要,你总是可以把这些信息放在方法的评论中