Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel5.x中使用存储库模式时,我们是否应该只在控制器中使用叙述方法?_Php_Laravel_Design Patterns_Laravel 5_Repository Pattern - Fatal编程技术网

Php 在Laravel5.x中使用存储库模式时,我们是否应该只在控制器中使用叙述方法?

Php 在Laravel5.x中使用存储库模式时,我们是否应该只在控制器中使用叙述方法?,php,laravel,design-patterns,laravel-5,repository-pattern,Php,Laravel,Design Patterns,Laravel 5,Repository Pattern,我在Laravel中有一个典型的存储库模式结构。以水果模型为例,我有: 类eloquentfruitpository,该类扩展了实现FruitRepositoryInterface的抽象eloquentpository ResultRepositoryInterface扩展了RepositoryInterface 最后,RepositoryInterface定义了一些通用/共享方法,如all,find,with,create等 我已经阅读了Laravel5中关于存储库模式的所有内容。我审查了所有

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

eloquentfruitpository
,该类扩展了实现
FruitRepositoryInterface
的抽象
eloquentpository

ResultRepositoryInterface
扩展了
RepositoryInterface

最后,
RepositoryInterface
定义了一些通用/共享方法,如
all
find
with
create

我已经阅读了Laravel5中关于存储库模式的所有内容。我审查了所有GitHub项目,审查了所有GIST,并且。。。我有点担心

我喜欢只使用叙述方法的方法,以我的水果模型为例,这种方法应该是雄辩的结果肯定的

因此,在我的控制器中,而不是构建如下内容:

$fruits = $this->fruitRepository
    ->where('color', '=', 'yellow')
    ->where('is_available', '=', true)
    ->with(['comments'])
    ->orderBy([
        'sweetness' => 'asc'
    ])
    ->all();
这样做更好吗

$fruits = $this->fruitRepository
    ->getAvailableYellowFruitsWithPeopleCommentsOrderedBySweetness();
然后在ElountifRuitResposition中定义该方法,如:

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();
}
所以一般来说,所有这些通用方法应该只在特定的有说服力的存储库中使用,还是也可以在controller中使用它们

目前这两种方法都有效。我问的是最佳实践,而不是任何人的偏好

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


感谢您的反馈。

您正在寻找一种“非常好的”实践,但您可能知道,在设计模式方面,没有一种通用的“最佳实践”适合所有情况

也就是说,一般规则是:当您需要在应用程序的多个点中进行查询时,将其放入存储库中。如果你只需要一次,这取决于你自己


我也会把它放在一个存储库中,但我会用一个更短、更可读的名称来命名这个方法,即:
getAvailableYellowFruits
。对我来说,“with”和“order by”部分可以忽略不计,如果你愿意,你可以把这些信息放在方法的注释中

放在一边,如果你把你的存储库分成不同的部分来表示你的应用程序逻辑,而不仅仅是模型访问包装(存储库的硬定义)然后,你可以有一个方法,如上面提到的特定于该应用程序的一部分。例如,管理仪表板将使用Account模型,该模型将具有AccountRepository。但是没有理由不让AdminRepository以特定格式返回应用程序该部分的帐户(帐户列表w/排序)。也许还有更好的说法。谢谢大家的反馈。注意。