我目前正在使用 lumen 创建 API而且我对于应该将数据库查询放在哪里并不完全有信心。我正在使用存储库模式,目前我的布局如下:
- Controller 加载自定义存储库
- 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/