返回顶部
首页 > 资讯 > 精选 >怎么理解Laravel存储库模式
  • 380
分享到

怎么理解Laravel存储库模式

2023-06-25 15:06:23 380人浏览 八月长安
摘要

这篇文章主要讲解了“怎么理解Laravel存储库模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Laravel存储库模式”吧!活动记录默认情况下,Laravel 使用 Active

这篇文章主要讲解了“怎么理解Laravel存储库模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Laravel存储库模式”吧!

活动记录

默认情况下,Laravel 使用 Active Record 模式。每个 Laravel 程序员都直观地使用它,因为它是在抽象的 Model 基类中实现的,而模型通常从它继承而来。让我们来看一个例子:

use Illuminate\Database\Eloquent\Model;class Person extends Model {}// --- 使用:$person = new Person();$person->first_name = 'Jack';$person->last_name = 'Smith';$person->save();

当然,您可以读写您在 Person 上创建的属性。 但是要保存模型,您也可以 直接在模型上调用方法。 不需要另一个对象——模型已经提供了访问相应数据库表的所有方法。

这意味着,域模型将您的自定义属性和方法与同一类中的所有数据访问方法相结合。 第二部分是通过继承 Model 来实现的。

要点:

  • Active Record 结合 域模型与数据访问功能。

  • Laravel 使用 Active Record 模式并通过 Model 类实现它。

Repository

Repository 模式是 Active Record 模式的替代方案。它还提供了处理数据访问的抽象。但更广泛地说,它可以被视为域对象的概念性存储库或集合。

与活动记录模式相反,存储模式将数据库访问与域模型分离。它提供了一个高级接口,你可以在其中创建、读取、更新和删除域模型,而不必考虑实际的底层数据存储。

底层的存储库可以通过构建和执行 sql 查询访问数据库,通过 REST api 访问远程系统,或者仅仅管理包含所有域模型的内存数据结构。这对测试很有用。存储库模式关键部分是它为其余代码提供的高级接口。

要点:

  • 存储库表示域对象的概念集合

  • 它只负责用高级接口封装数据访问。

  • Laravel 没有提供实现存储库模式的特定帮助程序

在 Laravel 中实现 Repository 模式时,我主要看到两种变体。

变体1:特定方法

在第一个变体中,存储库方法是重点和特定的。名称解释了调用者获得的内容,用于参数化底层查询的选项是有限的。

class InvoiceRepository {    public function findAllOverdue(Carbon $since, int $limit = 10): Collection {        return Invoice::where('overdue_since', '>=', $since)            ->limit($limit)            ->orderBy('overdue_since')            ->get();    }    public function findInvoicedToCompany(string $companyId): Collection {        return Invoice::where('company_id', $companyId)            ->orderByDesc('created_at')            ->get();    }}

这种方法的优势在于方法的表现力。阅读代码时,很清楚从方法中期望什么以及如何调用它们。这会导致更少的错误。 Repository 方法很容易测试,因为参数有限。

这种方法的一个缺点是,最终可能会在存储库中使用大量的方法。由于方法无法轻松重用,因此必须为新用例添加其他方法。

要点:

  • 存储模式可以通过提供特定方法的类来实现

  • 每个方法包装一个查询,只公开必要的参数

  • 优点: 可读性和可测试性

  • 缺点:  缺乏灵活性和较低的可重用性

变式2: 一般方法

另一方面的方法是提供一般的方法。这导致了方法的减少。但是这些方法有一个很大的 API 曲面,因为每个方法都可以使用不同的参数组合来调用。

其中的关键问题是参数表示。这种表示应该引导调用方理解方法签名并避免无效的输入。为此,您可以引入一个特殊的类,例如使用 Query Object 模式。

但是我在实践中经常看到的是标量参数和 PHP 数组的混合。调用方可以传递完全无效的输入,仅类型数据并不能说明要传递什么。但是如果使用得当,这种轻量级的方法可以避免更繁琐的抽象。

class InvoiceRepository {    public function find(array $conditions, string $sortBy = 'id', string $sortOrder = 'asc', int $limit = 10): Collection {        return Invoice::where($conditions)            ->orderBy($sortBy, $sortOrder)            ->limit($limit)            ->get();    }}// --- 使用:$repo = new InvoiceRepository();$repo->find(['overdue_since', '>=', $since], 'overdue_since', 'asc');$repo->find(['company_id', '=', $companyId], 'created_at', 'asc', 100);

这种方法减轻了第一种方法的问题:你可以得到更少的 Repository 方法,这些方法更灵活,并且可以更频繁地重用。

从消极的方面看,Repository 变得更加难以测试,因为有更多的案例需要覆盖。方法签名更难理解,正因为如此,调用者可能会犯更多错误。此外,还将引入某种查询对象表示形式。无论它是显式的还是隐式的(比如数组),您的 Repository 实现及其调用者都将与它耦合。

要点:

  • 存储库模式可以通过提供通用方法的类实现。

  • 难点在于方法参数的表示。

  • 优点: 更大的灵活性和更高的可复用性。

  • 缺点: 更难测试,可读性差,与参数表示耦合。

当然,这两种方法可以结合起来使用。也许你想要一些特定的方法用于复杂的查询,而一些通用的方法用于简单的 where 查询。

实现

现在,我们来谈谈如何实现方法体。

在上面的例子中,我使用了 Model 类的方法来获得对 Eloquent 查询构造器的访问。所以 Repository 的实现实际上使用了 Active Record 模式作为实现。

你不需要这样做。你可以使用 DB facade 来获得一个查询构建器,同时避免使用 Model 类。或者你可以直接编写 SQL 查询:

class InvoiceRepository {    public function findAllOverdue(Carbon $since, int $limit = 10): Collection {        return DB::table('invoices')            ->where('overdue_since', '>=', $since)            ->limit($limit)            ->orderBy('overdue_since')            ->get();    }    public function findInvoicedToCompany(string $companyId): Collection {        return DB::select('SELECT * FROM invoices                           WHERE company_id = ?                           ORDER BY created_at                           LIMIT 100', [$companyId]);    }}

存储模式的优点是,实现可以是任何东西,只要它满足接口。你还可以管理内存中的对象或者包(和缓存)一个 API。

但是最常见的是,底层数据存储是一个 SQL 数据库。要访问它,你可以根据每个方法选择最佳实现。对于性能关键的或者复杂的查询,你可能希望直接使用 SQL 语句。更简单的查询可以使用 Eloquent 查询生成器。

当你没有使用 模型 类来实现你的 Repository ,你可能会考虑在模型中不继承它。但是这个方法违反了很多内置的 Laravel 魔术方法,在我看来并不是一个好的方法。

要点:

  • 存储库模式很灵活,允许使用各种实现技术。

  • 在 Laravel 中,当访问数据库时,Eloquent 查询构建器是一个实用的选择。

接口

你的另一个选择是,是否要引入一个接口。上面的例子可以用一个接口和一个或多个实现来分隔:

// --- 接口:public interface InvoiceRepositoryInterface {    public function findAllOverdue(Carbon $since, int $limit = 10): Collection;    public function findInvoicedToCompany(string $companyId): Collection;}// --- 具体的类,实现了该接口class InvoiceRepository implements InvoiceRepositoryInterface {    public function findAllOverdue(Carbon $since, int $limit = 10): Collection {        // 实现    }    public function findInvoicedToCompany(string $companyId): Collection {        // 实现    }}

添加接口是一种额外的间接方法,并不一定是好的。如果您的应用程序是 Repository 的唯一用户,并且您不希望它有多个实现,那么我不认为引入接口有什么意义。对于测试,Repository 可以用 phpUnit 模拟,只要它不被标记为 final

如果你知道你将有多个实现,你应该使用一个接口。如果你正在编写一个将在多个项目中使用的 包。或者你想要测试一个特殊的 Repository 实现,那么可能会发生不同的实现。

为了从 Laravel 的依赖注入中获益,你必须将具体的实现绑定到接口上。这必须在服务提供者的注册方法中完成。

use Illuminate\Support\ServiceProvider;class RepositoryServiceProvider extends ServiceProvider {    public function reGISter(): void {        $this->app->bind(InvoiceRepositoryInterface::class, InvoiceRepository::class);    }}

要点:

  • 一个接口可以进一步 解耦 从代码的其余部分获取代码库。

  • 当您期望有多个具体类实现它时,使用 Repository 接口。

  • 在 Laravel 中,将具体类绑定到服务提供者中的接口。

感谢各位的阅读,以上就是“怎么理解Laravel存储库模式”的内容了,经过本文的学习后,相信大家对怎么理解Laravel存储库模式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么理解Laravel存储库模式

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

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

猜你喜欢
  • 怎么理解Laravel存储库模式
    这篇文章主要讲解了“怎么理解Laravel存储库模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Laravel存储库模式”吧!活动记录默认情况下,Laravel 使用 Active...
    99+
    2023-06-25
  • Laravel中存储库模式有什么作用
    这篇文章主要讲解了“Laravel中存储库模式有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Laravel中存储库模式有什么作用”吧!单一责任原则单一责任原则是主要鉴别器来区分Ac...
    99+
    2023-06-25
  • Laravel中存储库模式有什么优点
    这篇文章主要介绍“Laravel中存储库模式有什么优点”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel中存储库模式有什么优点”文章能帮助大家解决问题。单一责任原则单一责任原则是主要鉴别器...
    99+
    2023-07-04
  • 怎么理解Ceph分布式存储集群
    怎么理解Ceph分布式存储集群,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在规划Ceph分布式存储集群环境的时候,对硬件的选择很重要,这关乎整个Ceph集群的...
    99+
    2023-06-06
  • MySQL怎么存储无模式的数据
    MySQL是关系型数据库管理系统,不支持直接存储无模式的数据。无模式的数据通常指的是非结构化或半结构化数据,例如文本文件、图像、音频...
    99+
    2023-08-23
    MySQL
  • Entity Framework怎么使用Code First模式管理存储过程
    这篇文章主要介绍“Entity Framework怎么使用Code First模式管理存储过程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Entity Framewo...
    99+
    2023-06-29
  • OneFlow源码解析之Eager模式下Tensor存储管理
    目录1不同Tensor类型的存储管理方式2Tensor 存储相关类的关系3通过虚拟机指令为 Tensor 分配存储3.1 存储相关对象的构造3.2 在指令执行过程中分配 tensor...
    99+
    2023-05-16
    OneFlow Eager Tensor Tensor存储管理
  • Laravel怎么生成url模式
    这期内容当中小编将会给大家带来有关Laravel怎么生成url模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Laravel 生成url模式通过url辅助函数(路由)生成  &nbs...
    99+
    2023-06-15
  • EntityFramework使用CodeFirst模式管理存储过程
    在EF中使用存储过程和使用视图是很相似的,一般会使用Database对象上的两个方法:SqlQuery和ExecuteSqlCommand。为了从存储过程中读取很多数据行,我们只需要...
    99+
    2024-04-02
  • Laravel怎么集成GitHub来存储文件
    这篇文章主要讲解了“Laravel怎么集成GitHub来存储文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Laravel怎么集成GitHub来存储文件”吧!GitHub API 介绍接口...
    99+
    2023-06-26
  • MySQL存储引擎怎么理解
    这篇文章主要讲解了“MySQL存储引擎怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL存储引擎怎么理解”吧!今天发现了一个神奇的参数:-si...
    99+
    2024-04-02
  • Oracle存储过程怎么理解
    今天小编给大家分享一下Oracle存储过程怎么理解的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、存储过程通俗理解简单理解...
    99+
    2023-07-05
  • MySQL存储过程怎么理解
    MySQL存储过程是一段预先编译好的SQL代码块,可以被多次调用和执行。它可以接受参数、执行SQL语句、执行控制流程和返回结果。存储过程的主要目的是将一系列的SQL操作组合在一起,并在数据库服务器上进行执行。这样可以提高数据库的性能,减...
    99+
    2023-08-11
    MySQL
  • 云原生存储中的容器存储与 K8s 存储卷怎么理解
    本篇文章为大家展示了云原生存储中的容器存储与 K8s 存储卷怎么理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。云原生存储的两个关键领域:Docker 存储卷、K8s 存储卷;Docker 存储卷...
    99+
    2023-06-04
  • 怎么理解SQL的存储过程
    本篇文章为大家展示了怎么理解SQL的存储过程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、MySQL的存储的过程:一个存储过程是一个可的函数,它在中创建并保存。...
    99+
    2024-04-02
  • es6代理模式怎么理解
    本文小编为大家详细介绍“es6代理模式怎么理解”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6代理模式怎么理解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2024-04-02
  • Java代理模式怎么理解
    本篇内容介绍了“Java代理模式怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、静态代理模式1.1、 代理模式的定义:由于某些原因...
    99+
    2023-06-22
  • maven存储库路径无效怎么解决
    如果Maven存储库路径无效,可以尝试以下解决方法:1. 检查Maven存储库路径是否正确。确保路径中没有拼写错误或其他错误。2. ...
    99+
    2023-09-12
    maven
  • Mysql怎么存储json格式数据详解
    目录前言JSON 数据类型推荐使用在不经常更新的静态数据存储查询json数据 增加索引使用场景总结 前言 Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Js...
    99+
    2024-04-02
  • 怎么理解Java内存模型
    本篇内容主要讲解“怎么理解Java内存模型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java内存模型”吧!内存模型的由来 计算机在执行程序的时候每条指令都是由CPU来执行的。而CPU...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作