laravel - 使用存储库模式在哪里放置 Laravel 查询

标签 laravel lumen

我目前正在使用 lumen 创建 API而且我对于应该将数据库查询放在哪里并不完全有信心。我正在使用存储库模式,目前我的布局如下:

  1. Controller 加载自定义存储库
  2. Repository方法包含 Eloquent 查询并返回结果。

Controller --> Custom Repository --> Model

Controller <-- Custom Repository <-- Model

-- 我目前正在做的高级代码示例:

Controller .php

public function browse()
{
    // customRepo added via dependency injection
    $this->customRepo->browse()
}

customRepo.php

public function browse()
{
    // other logic here
    return Member::where('active', 1)->orderBy('date', 'desc')->get()
}

我正在使用 Eloquent 对数据库进行查询,目前所有这些调用都发生在存储库内,这对我来说有点奇怪,因为我的存储库充满了 Eloquent(和一些查询生成器)查询,但是我有从一些来源看到它是 not correct将查询放入模型中。

我觉得我当前的方法可能是正确的,我只是想看看是否有人能明确地告诉我哪个是最好的 - 如果不需要的话,用自定义方法填充模型对我来说没有多大意义.

最佳答案

需要考虑的几点。首先,对术语进行一些澄清。您举例说明的存储库模式实际上并不是 Repository pattern 。它更类似于 Data Access Object pattern 。请参阅quentin-starin's answer简要描述两者之间的差异。其次,MVC 架构中的模型不仅仅是一个扩展(在本例中是 Eloquent 的)Model 类的类。关于它的文章已经有很多,但为了简洁起见,该模型通常是 MVC 应用程序的一个复合方面,除了域/业务逻辑之外,它还处理数据管理。我将使用术语实体来指代您创建的特定的基于 Eloquent 的类(例如 - 成员)。鉴于这种理解(对于代码重用/松散耦合/SRP/等),在模型中放置任何查询肯定是有益的。但最好不要直接在实体中处理数据持久性。剩下的问题是,“我应该如何访问模型和/或实体?”。

我见过并使用的一种方法是像您一样直接从 Controller 调用存储库/DAO 的方法。为了可测试性,这通常通过将相关实体的实例注入(inject)存储库类来完成。例如,在您的 customRepo.php 文件中,您可以创建类似于以下内容的内容:

protected $model;

public function __construct(\App\Member $model)
{
    $this->model = $model;
}

public function getActiveMembers()
{
    return $this->model->where('active', 1)->orderBy('date', 'desc')->get()
}
另一种方法是通过服务层在 Controller 和存储库之间创建一个额外的抽象层,其中对存储库等的调用。将居住。该服务层可以是触发域事件、在数据库事务中包装多个数据访问方法等的地方。我个人的方法是,当我认识到需要它们和/或开始违反 SOLID 时,创建新的抽象层。原则。在那之前,KISS .

关于laravel - 使用存储库模式在哪里放置 Laravel 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43243383/

相关文章:

laravel - 多重身份验证时出错

php - 使用 Laravel 获取公共(public) IP 地址

laravel - 为什么 "sail up"命令没有构建我的 laravel docker 容器?

php - lumen 使用给定数组的 faker 生成假数据

php - 如何在 Lumen 8.0 中使用 Helper 类?

流明如何缓存配置?

php - 如何在 laravel 中对 json 对象进行排序

php - Lumen 框架未命中 Vscode 上的断点

php - Laravel/流明 PSR-4 : If I put classes into subdirectories do I have to use different namespaces then?

php - Laravel 中取 10 条记录并跳过 10 条记录