返回顶部
首页 > 资讯 > 精选 >Laravel中存储库模式有什么优点
  • 528
分享到

Laravel中存储库模式有什么优点

2023-07-04 18:07:56 528人浏览 八月长安
摘要

这篇文章主要介绍“Laravel中存储库模式有什么优点”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel中存储库模式有什么优点”文章能帮助大家解决问题。单一责任原则单一责任原则是主要鉴别器

这篇文章主要介绍“Laravel中存储库模式有什么优点”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel中存储库模式有什么优点”文章能帮助大家解决问题。

单一责任原则

单一责任原则是主要鉴别器来区分Active Record模式和存储库模式。模型类已经保存数据并提供域对象的方法。当使用Active Record模式时,数据访问是额外引入的责任。这是我想在以下示例中说明的东西:

class Employee extends Model {}$jack = new Employee();$jack->first_name = 'Jack';$jack->company_id = $twitterId;$jack->save();

虽然域模型和数据访问技术的职责混合,但它直观上看还说得过去。在我们的应用程序中,员工必须以某种方式存储在数据库中,因此为什么不调用对象上的save()。单个对象被转化成单个数据行并存储。

但是,让我们更进一步,看看我们还能对员工做些什么:

$jack->where('first_name', 'John')->firstOrFail()->delete();$competition = $jack->where('company_id', $facebookId)->get();

现在,它变得不直观,甚至违背了我们的域模型。 为什么 Jack 会突然删除另一个甚至可能在不同公司工作的员工? 或者他为什么能把 Facebook 的员工拉过来?

当然,这个例子是人为设计的,但它仍然显示了 Active Record 模式如何不允许有意的域模型。 员工与所有员工列表之间的界限变得模糊。 您始终必须考虑该员工是被用作实际员工还是作为访问其他员工的机制。

仓库模式通过强制执行这个基本分区来解决这个问题。它的唯一用途是标识域对象的合集,而不是域对象的本身。

要点:

  • 通过将所有域对象的集合与单个域对象分离, 仓库模式体现了单一责任原则

不要重复自己 (DRY)

一些项目数据库查询洒遍了整个项目。下面是一个例子,我们从数据库中获取列表,并在 Blade 视图中显示他们。

class InvoiceController {    public function index(): View {        return view('invoices.index', [            'invoices' => Invoice::where('overdue_since', '>=', Carbon::now())                ->orderBy('overdue_since')                ->paginate()        ]);    }}

当这样的查询遍得更加复杂并且在多个地方使用时,考虑将其提取到 Repository 方法中。

存储库模式通过将重复查询打包到表达方法中来帮助减少重复查询。如果必须调整查询,只需更改一次即可。

class InvoiceController {    public __construct(private InvoiceRepository $repo) {}    public function index(): View {        return view('invoices.index', [            'invoices' => $repo->paginateOverdueInvoices()        ]);    }}

现在查询只实现一次,可以单独测试并在其他地方使用。此外,单一责任原则再次发挥作用,因为控制器不负责获取数据,而只负责处理Http请求和返回响应。

Takeaway:

  • 存储库模式有助于减少重复查询

依赖反转

解释 Dependency Inversion Principle 值得发表自己的博客文章。我只是想说明存储库可以启用依赖项反转。

在对组件进行分层时,通常较高级别的组件依赖于较低级别的组件。 例如,控制器将依赖模型类从数据库中获取数据:

class InvoiceController {    public function index(int $companyId): View {        return view(            'invoices.index',            ['invoices' => Invoice::where('company_id', $companyId)->get()]        );    }}

依赖关系是自上而下的,紧密耦合的。 InvoiceController 取决于具体的 Invoice 类。 很难将这两个类解耦,例如单独测试它们或替换存储机制。 通过引入 Repository 接口,我们可以实现依赖倒置:

interface InvoiceRepository {    public function findByCompanyId($companyId): Collection;}class InvoiceController {    public function __construct(private InvoiceRepository $repo) {}    public function index(int $companyId): View {        return view(            'invoices.index',            ['invoices' => $this->repo->findByCompanyId($companyId)]        );    }}class EloquentInvoiceRepository implements InvoiceRepository {    public function findByCompanyId($companyId): Collection {        // 使用 Eloquent 查询构造器实现该方法    }}

Controller 现在只依赖于 Repository 接口, 和 Repository 实现一样. 这两个类现在只依赖于一个抽象, 从而减少耦合

Takeaway:

  • 存储库模式作为一种抽象类,支持依赖反转.

抽象类

存储库 提高了可读性 因为复杂的操作被具有表达性名称的高级方法隐藏了.

访问存储库的代码与底层数据访问技术分离. 如有必要,您可以切换实现,甚至可以省略实现,仅提供 Repository 接口。 这对于旨在与框架无关的库来说非常方便。

OAuth3 服务包 ——  league/oauth3-server 也用到这个抽象类机制。 Laravel Passport 也通过 实现这个库的接口 集成 league/oauth3-server 包。

正如 @bdelespierre 在 评论 里回应我之前的一篇博客文章时向我指出的那样,你不仅可以切换存储库实现,还可以将它们组合在一起。大致以他的示例为基础,您可以看到一个存储库如何包装另一个存储库以提供附加功能:

interface InvoiceRepository {    public function findById(int $id): Invoice;}class InvoiceCacheRepository implements InvoiceRepository {    public function __construct(        private InvoiceRepository $repo,        private int $ttlSeconds    ) {}    public function findById(int $id): Invoice {        return Cache::remember(            "invoice.$id",            $this->ttlSeconds,            fn(): Invoice => $this->repo->findById($id)        );    }}class EloquentInvoiceRepository implements InvoiceRepository {    public function findById(int $id): Invoice {  }}// --- 用法:$repo = new InvoiceCacheRepository(    new EloquentInvoiceRepository(););

要点:

  • 存储库模式抽象了有关数据访问的详细信息。

  • 存储库将客户端与数据访问技术分离

  • 这允许切换实现,提高可读性并实现可组合性。

可测试性

存储库模式提供的抽象也有助于测试。

如果你有一个 Repository 接口,你可以提供一个替代的测试实现。 您可以使用数组支持存储库,而不是访问数据库,将所有对象保存在数组中:

class InMemoryInvoiceRepository implements InvoiceRepositoryInterface {    private array $invoices;    // implement the methods by accessing $this->invoices...}// --- Test Case:$repo = new InMemoryInvoiceRepository();$service = new InvoiceService($repo);

通过这种方法,您将获得一个现实的实现,它速度很快并且在内存中运行。 但是您必须为测试提供正确的 Repository 实现,这 ** 本身可能需要大量工作**。 在我看来,这在两种情况下是合理的:

  • 您正在开发一个(与框架无关的)库,它本身不提供存储库实现。

  • 测试用例复杂,Repository 的状态很重要。

另一种方法是“模仿”,要使用这种技术,你不需要适当的接口。你可以模仿任何 non-final 类。
使用 PHPUnit api ,您可以明确规定如何调用存储库以及应该返回什么。

$companyId = 42;$repo = $this->createMock(InvoiceRepository::class);$repo->expects($this->once())    ->method('findInvoicedToCompany')    ->with($companyId)    ->willReturn(collect([  ]));$service = new InvoiceService($repo);$result = $service->calculateAvgInvoiceAmount($companyId);$this->assertEquals(1337.42, $result);

有了 mock,测试用例就是一个适当的单元测试。上面示例中测试的唯一代码是服务。没有数据库访问,这使得测试用例的设置和运行非常快速

另外:

  • 仓库模式允许进行适当的单元测试,这些单元测试运行快并且是隔离的

关于“Laravel中存储库模式有什么优点”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Laravel中存储库模式有什么优点

本文链接: https://lsjlt.com/news/346675.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Laravel中存储库模式有什么优点
    这篇文章主要介绍“Laravel中存储库模式有什么优点”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel中存储库模式有什么优点”文章能帮助大家解决问题。单一责任原则单一责任原则是主要鉴别器...
    99+
    2023-07-04
  • Laravel中存储库模式有什么作用
    这篇文章主要讲解了“Laravel中存储库模式有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Laravel中存储库模式有什么作用”吧!单一责任原则单一责任原则是主要鉴别器来区分Ac...
    99+
    2023-06-25
  • 怎么理解Laravel存储库模式
    这篇文章主要讲解了“怎么理解Laravel存储库模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Laravel存储库模式”吧!活动记录默认情况下,Laravel 使用 Active...
    99+
    2023-06-25
  • mysql存储过程有什么优点
    本篇内容主要讲解“mysql存储过程有什么优点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql存储过程有什么优点”吧!在mysql中,存储过程是一组为了...
    99+
    2024-04-02
  • mysql存储过程有什么优缺点
    这篇文章主要介绍“mysql存储过程有什么优缺点”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql存储过程有什么优缺点”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • minio分布式存储的优缺点是什么
    Minio分布式存储的优点包括: 高可用性:Minio可以通过数据分布和冗余来提高系统的可用性,即使部分节点发生故障也不会影响系统...
    99+
    2024-04-09
    minio
  • Laravel中的路径存储:Java有什么技巧?
    Laravel是一个流行的PHP框架,它提供了很多方便的功能,包括路径存储。Java中也有一些类似的技巧,本文将介绍Laravel中的路径存储以及Java中的一些技巧。 一、Laravel中的路径存储 Laravel提供了一个方便的路径存储...
    99+
    2023-07-26
    存储 laravel path
  • java中什么是单例模式?有哪些优点?
    一.什么是单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式就是: 在程序运行期间, 某些类有且最多只有一个实例对象。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对...
    99+
    2016-08-26
    java入门 java 单例模式 优点
  • Laravel中的文件存储是什么
    在Laravel中,文件存储是指将文件上传到服务器或存储在本地文件系统中,并在需要时进行访问和管理。Laravel提供了便捷的文件存...
    99+
    2024-04-16
    Laravel
  • 存储过程的优点是什么?
    以下是存储过程的优点:由于存储过程是编译和存储的,因此无论何时调用过程,响应都很快。您可以将所有必需的 SQL 语句分组在一个过程中并立即执行它们。由于过程存储在数据库服务器上这比客户端更快。您可以使用它执行所有复杂的查询,这会更快。使用过...
    99+
    2023-10-22
  • 网络私有云存储的优缺点是什么
    优点:1. 数据安全性高:网络私有云存储可以提供更高的数据安全性,因为它们仅限于内部使用,可避免外部攻击和数据泄露。2. 自定义性强...
    99+
    2023-05-25
    网络私有云存储 云存储
  • 分布式存储服务器的优缺点是什么
    分布式存储服务器的优缺点:1、分布式存储服务器的优点是允许设备资源共享,具有计算迁移功能,能加快计算速度,可靠性高,能保证系统不因一...
    99+
    2023-02-08
    分布式存储服务器 服务器
  • Redis集群模式有哪些及有什么优点
    本篇内容主要讲解“Redis集群模式有哪些及有什么优点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis集群模式有哪些及有什么优点”吧!单机模式单机模式的redis非常简单,你只需要启动一...
    99+
    2023-06-27
  • 分布式云存储服务器有哪些优点
    1. 可靠性高:分布式云存储服务器可以将数据副本存储在多个节点上,当一个节点出现故障时,系统可以自动切换到其他节点上,保证数据的可用...
    99+
    2023-06-10
    分布式云存储
  • MySQL存储引擎优缺点是什么
    本篇内容介绍了“MySQL存储引擎优缺点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!今天主要分享常见的存储引擎:MyISAM、Inn...
    99+
    2023-06-02
  • 服务器分布式存储的六大优点是什么
    本篇内容介绍了“服务器分布式存储的六大优点是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分布式存储往往采用分布式的系统结构,利用多台存...
    99+
    2023-06-02
  • 企业私有云存储构建的优点和缺点是什么
    企业私有云存储构建的优点:1. 数据安全性高:企业私有云存储可以保证数据只在企业内部传输和存储,数据的安全性更高。2. 可控性强:企...
    99+
    2023-05-24
    企业私有云存储 私有云存储 云存储
  • MySQL存储过程的优缺点是什么
    这篇文章主要介绍MySQL存储过程的优缺点是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调...
    99+
    2024-04-02
  • oracle存储过程的优缺点是什么
    这篇文章给大家分享的是有关oracle存储过程的优缺点是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。oracle存储过程的优点有:简化了复杂的操作,降低了错误出现几率以及执...
    99+
    2024-04-02
  • MySQL中存储过程的优缺点有哪些
    这篇文章给大家介绍MySQL中存储过程的优缺点有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。存储过程可以有效提高 SQL 语句的复用率,并且可以将相关的一组 SQL 放入到存储过程中,从而避免了应用程序的多次查询...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作