Laravel 4 使用存储库模式(由 Eloquent 支持)和缓存的可扩展设计
Posted
技术标签:
【中文标题】Laravel 4 使用存储库模式(由 Eloquent 支持)和缓存的可扩展设计【英文标题】:Laravel 4 scalable design using Repository Pattern (backed by Eloquent) and Caching 【发布时间】:2014-11-23 10:08:46 【问题描述】:您好 *** 用户,希望您能帮助我提供一些答案和意见。
我正在设计一个选择 Laravel 4 作为框架的系统。 由于 Laravel 通过 Eloquent 使用的 ActiveRecord 复杂性,我在尝试进行单元测试时遇到了问题。
我发现存储库模式是一个不错的选择,同时它还允许我创建自己的一组库,这些库可以轻松分离且不依赖于框架。
话虽如此,我开始使用它,它允许很好的单元测试集成和 IoC 的使用。 (我创建了自己的普通旧对象,并在存储库中映射了 Eloquent 模型和这些实体)
到目前为止一切顺利,但现在这是我的两个主要问题:
A) 如何轻松添加缓存? B) 当多个存储库使用 Eloquent 模型时,如何保持缓存一致性?对于 A)
我正在阅读 Laravel 文档和网络上的一些帖子,似乎即使在配置文件上启用缓存 (memcache) 时,实际使用它的唯一方法是从模型,然后使用remember()
方法。
但这要求每个使用该模型的存储库创建一个构建器,并且开发人员记得使用remember()
方法。
我错过了什么吗?有没有更好的方法?
我能想到的唯一方法是覆盖 Eloquent 特定模型上的 newBaseQueryBuilder()
方法并在返回实例之前调用 remember()
方法,但感觉有点 hacky。
但是,我注意到执行更新操作不会清除缓存,所以感觉没什么用,因为缓存数据可能会返回不再有效的值。
对于 B)
如果我有多个影响同一个模型的存储库,由于缓存不能很好地清除,如果我们开始使用Cache
门面单独处理缓存,它将很快变得无法管理、无法扩展并且容易出现错误。
阅读了一些帖子和博客 (http://culttt.com/2014/02/03/laravel-4-cache-service/) 并有了一些基本使用 装饰器模式 的好主意,因此我们对存储库进行了 Cachable 实现。
然而,尽管这是一个好主意,但问题来自 A) 中所述的问题,许多存储库影响相同的模型,因此无法在不同的存储库中一致地处理对象的相同缓存值。
我在这里询问您可能已经想到或实施的解决方案,以及对我的以下想法的意见。
想法
继续使用存储库模式(但是,不要使其实现特定于 ORM,即EloquentUserRepository
)
使用数据访问对象模式包装模型。
我的 DAO 将反过来提供 Eloquent 特定的实现。
在 DAO 上使用装饰器模式来提供缓存层,并且由于该模式,它还允许我保持缓存逻辑非常集中且松散耦合。
让存储库使用 DAO
使用服务提供者,我可能有不同的缓存机制,具体取决于对象(静态数据将使用 APC,而更多易失性数据将在 Memcache 上,其他可能在 Membase 上)
.
感谢您的所有帮助和意见。
【问题讨论】:
这帮助我做出了决定:laracasts.com/forum/… 【参考方案1】:Jeffrey Way 做了很多测试,并为 laravel 写了很多关于这个主题的文章。这是我在模型中测试时遇到的一篇文章。它可能有帮助,也可能没有帮助。 - http://code.tutsplus.com/tutorials/testing-like-a-boss-in-laravel-models--net-30087
https://www.youtube.com/watch?v=ajoFwWwSHTI
【讨论】:
以上是关于Laravel 4 使用存储库模式(由 Eloquent 支持)和缓存的可扩展设计的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 与存储库/服务设计模式的关系