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 与存储库/服务设计模式的关系

在 Laravel 中管理关系,遵循存储库模式

API 调用驻留在存储库模式 laravel 应用程序中的啥位置?

Laravel 4:将从存储库获得的验证消息传递给控制器

带有存储库的 Laravel View Composer 不工作;