Laravel存储库

时间:2013-06-28 14:32:20

标签: php laravel laravel-4

Laravel中存储库有哪些优点?它似乎是从应用程序的业务逻辑中抽象出Model层。虽然它实际上似乎只是使整个请求生命周期变得更加复杂而没有什么好处。

有人能否了解Laravel存储库的优势?


修改

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

  • 存储库强制执行单一职责
  • 存储库只应返回一个实体集合
  • 虽然与依赖注射分开但概念是兄弟
  • 实际存储实施的存储抽象(例如MySQL)
  • 更容易测试

5 个答案:

答案 0 :(得分:32)

与提供的教程一样,存储库不是Laravel概念所必需的。相反,它们是LaoC的一种IoC注入形式。任何可能类似注入的对象并不意味着它是一个存储库。请参阅视频,了解泰勒奥特威尔的一个很好的例子,它碰巧也使用了“存储库”:http://vimeo.com/53029232

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

答案 1 :(得分:2)

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

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

代码难以阅读,难以查看。它可以封装在存储库方法中,并展示更清晰的代码意图:

$users = $userRepository->getUsersWhoAreNotModerators();

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

答案 2 :(得分:1)

存储库有助于保持控制器清洁并生成可重用的代码。存储库中的函数可以在一个或多个控制器,存储库等中访问。此外,所有与后端相关的逻辑(如从数据库或外部调用中获取数据)都可以添加到存储库中以进行逻辑分离。

存储库的主要用途之一是创建不同的绑定(使用接口来定义您的函数,并在app.bind的帮助下根据需要绑定函数的不同实现)。例如:两个独立的存储库(实现父存储库/接口)处理后端数据的数据库和文件。

希望这会有所帮助。谢谢!

答案 3 :(得分:1)

使用存储库模式的主要原因是能够轻松更改数据源。例如,根据我的经验,最常见的更改是添加缓存层,因为存储库实现了一个接口,您需要做的就是使用处理缓存的新方法构建实现相同接口的新对象并更改绑定。

答案 4 :(得分:0)

根据我的经验,Laravel 中的存储库的好处是:

  1. 使用存储库最重要的一点是您可以随时以任何您喜欢的理由更改您的 ORM。例如,你想从 MySQL eloquent 迁移到其他一些 SQLite ORM。

  2. 帮助您保持控制器清洁和可读。

  3. 帮助您将存储库中的方法重用于任何其他控制器。

  4. 您可以将 BaseRepository 添加到您的存储库列表中,它涉及所有基本方法,例如 all()get()findOrFail()firstOrFail()paginate() , create(), ... 并在其他存储库中使用它们。

  5. 为存储库使用接口并绑定它们,这些接口也可用作 Laravel 中的服务。