Laravel 存储库

2022-08-30 19:54:10

Laravel中的存储库有哪些优势?它似乎从应用程序的业务逻辑中抽象出模型层。尽管它似乎真的只是使整个请求生命周期变得更加复杂,而收益却很小。

有人可以阐明Laravel存储库的优势吗?


编辑

现在使用存储库一段时间后,我会添加以下内容:

  • 存储库强制实施单一责任
  • 存储库应仅返回一个实体集合
  • 虽然与依赖性注入分开,但这些概念是兄弟
  • 实际存储实现的存储抽象(例如 MySQL)
  • 测试更简单

答案 1

存储库(如提供的教程中所示)不需要 Laravel 概念。相反,它们是一种IoC注入形式,可以通过Laravel实现。任何可能类似注入的对象并不意味着它是一个存储库。请参阅视频,了解泰勒·奥特韦尔(Taylor Otwell)的一个很好的例子,它碰巧也使用了“存储库”:http://vimeo.com/53029232

在此示例中,存储库抽象出传递到控制器的数据来自何处。只要传递的数据实现了指定的接口,控制器就可以“幸福地”使用接口定义的方法,而不必担心数据最初来自哪里。这允许在不破坏控制器的情况下切换数据的初始源。您可以从文件、数据库、外部 API、模拟对象或仅从某个任意数组中提取数据。基本上,控制器不需要收集存储库表示的数据。它可以只是接收和使用。


答案 2

除了这里的其他答案之外,值得指出的是,在Laravel中使用的存储库可以增加额外的表现力。以下面为例:

$users = User::whereHas("role", function($q) {
    $q->where('name', 'moderator');
}, '<', 1)->get();

代码难以阅读,看起来很尴尬。它可以封装在存储库方法中,并演示更清晰的代码意图:

$users = $userRepository->getUsersWhoAreNotModerators();

使用雄辩的“查询范围”也可以实现,但我认为使用存储库更优越,因为更好地遵循单一责任原则,并且无论您是否使用Eloquent都是可行的。


推荐