我正在构建一个从许多潜在来源获取数据的Laravel 5.3应用程序。这是一个有3个来源的后备系统:
所有3个来源都非常简单,可以通过以下两种方法以相同的方式访问:
function get($id)
function query($type, $string)
我知道围绕实现这一目标的不同方法有各种术语,但在阅读文档后,我不确定最干净的方法是什么。每个数据源应该实现为Repository
吗?包裹在容器中的ServiceProvider
?我发现文档很透彻,但缺乏整体/高级解释,所以任何指针都会受到赞赏。
答案 0 :(得分:0)
使用类似集合的接口访问域对象,在域和数据映射层之间进行调解。存储库封装了持久存储在数据存储中的对象集以及对它们执行的操作,从而提供了更加面向对象的持久层视图。存储库还支持在域和数据映射层之间实现清晰分离和单向依赖的目标。
考虑到这一点,你可以说Eloquent本身是一个更大的存储库模式实现,但仍然是一个存储库。由于它是一个ActiveRecord实现,因此存储库和存储机制之间没有任何真正的分离。
具体来说,对于你的问题,Laravel并不会真正涵盖Repository Pattern本身,就像它不包括Service class或Singletons一样:Laravel没有责任教你这些模式,它只是给你带来的手段如果您选择实施这些模式,则可以更轻松地组织这些模式。
所有这一切,我同意你的看法,每个数据源都实现自己的RepositoryInterface
。从那里,您可以注册自己的ServiceProvider,然后实例化一个自定义服务类,其目的是返回相应的存储库。
如果确定适当的存储库在逻辑上很轻,并且仅依赖于负责备用数据源的Controller,则可以使用Contextual Binding并完全跳过服务类。
无论哪种方式,都有一些方法可以让这只猫受到伤害,但你走在正确的轨道上。
编辑:顺便说一句,如果你想严格按照“书”的说法,你可能想要分别连接到每个数据存储的不同存储类,你然后可以适当查询。然后,您的存储库(可能包含相同类型的数据集合,无论其存储起源如何)都可以对返回的结果负责。
否则,如果您想尽可能坚持使用Eloquent,可以查看multiple data connections以容纳每个数据集。