Laravel 中存储库的优势是什么?它似乎是从应用程序的业务逻辑中抽象出模型层。尽管它实际上似乎只是使整个请求生命周期变得更加复杂而收效甚微。
有人可以阐明 Laravel 存储库的优势吗?
编辑
现在使用存储库一段时间后,我将添加以下内容:
- 存储库强制执行单一职责
- 存储库应该只返回一个实体集合
- 虽然与依赖注入分开,但概念是兄弟
- 实际存储实现的存储抽象(例如 MySQL)
- 更容易测试
与提供的教程一样,存储库不是 Laravel 概念所必需的。相反,它们是 Laravel 可以实现的一种 IoC 注入形式。任何可能同样被注入的对象并不意味着它是一个存储库。有关 Taylor Otwell 的一个很好的示例,请参阅视频,该示例恰好也使用了“存储库”:http: //vimeo.com/53029232。
在此示例中,存储库抽象出数据的来源,并将其传递给控制器。只要传递的数据实现了指定的接口,控制器就可以“愉快地”使用接口定义的方法,而不必担心数据最初来自哪里。这允许在不破坏控制器的情况下切换数据的初始源。您可以从文件、数据库、外部 API、模拟对象或任意数组中提取数据。基本上,控制器不需要收集存储库表示的数据。它只能接收和使用。
存储库有助于保持控制器清洁并制作可重用代码。存储库中的功能可以在一个或多个控制器、存储库等中访问。
此外,所有与后端相关的逻辑(如从数据库或外部调用中获取数据)都可以添加到存储库中以进行逻辑分离。
存储库的主要用途之一是创建不同的绑定(使用接口定义您的函数,并在应用程序的帮助下,根据需要绑定函数的不同实现)。例如,两个独立的存储库(实现父存储库/接口)处理后端数据的数据库和文件。
除了这里的其他答案,值得指出的是,在 Laravel 中使用的存储库可以增加额外的表现力。举个例子:
$users = User::whereHas("role", function($q) {
$q->where('name', 'moderator');
}, '<', 1)->get();
该代码难以阅读且难看。它可以封装在存储库方法中,并展示更清晰的代码意图:
$users = $userRepository->getUsersWhoAreNotModerators();
这也可以使用 eloquent 的“查询范围”来实现,但我认为使用存储库更好,因为它更好地遵守单一责任主体,并且无论您是否使用 Eloquent 都是可行的。
使用存储库模式的主要原因是能够轻松更改数据源。例如,根据我的经验,最常见的更改是添加缓存层,因为存储库实现了一个接口,您所需要做的就是构建实现相同接口的新对象,并使用处理缓存的新方法并更改绑定。
根据我的经验,Laravel 中的存储库有以下好处:
使用存储库最重要的一点是,您可以随时以任何您喜欢的原因更改您的 ORM。例如,你想从 MySQL eloquent 迁移到其他一些 SQLite ORM。
帮助您保持控制器的清洁和可读性。
帮助您将存储库中的方法重用于任何其他控制器。
您可以将 BaseRepository 添加到您的存储库列表中,其中涉及所有基本方法,如all()
, get()
, findOrFail()
, firstOrFail()
, paginate()
, create()
, ... 并在其他存储库中使用它们。
将接口用于存储库并绑定它们,它们也可以用作 Laravel 中的服务。