Laravel 4使用Repository Pattern(由Eloquent支持)和Caching进行可扩展设计


Laravel 4 scalable design using Repository Pattern (backed by Eloquent) and Caching

StackOverflow用户您好,希望您能为我提供一些答案和意见。

我正在设计一个选择Laravel 4作为框架的系统。由于Laravel通过Eloquent使用的ActiveRecord复杂性,我在尝试单元测试时遇到了问题。

考虑到这一点,我发现Repository模式是一个很好的替代方案,同时它还允许我创建自己的一组库,这些库可以很容易地分离,而不依赖于框架。

话虽如此,我开始使用它,它允许很好的单元测试集成和IoC的使用。(我创建了自己的Plain Old Objects,并在Eloquent模型和这些实体之间的存储库中进行了映射)

到目前为止还不错,但现在是我的两个主要问题:

  • A) 如何轻松添加缓存
  • B) 当多个存储库使用Eloquent模型时,如何保持缓存的一致性

对于A)

我正在阅读Laravel文档和网上的一些帖子,似乎即使在配置文件上启用缓存(memcache),实际使用它的唯一方法也是从模型中创建一个QueryBuilder实例,然后使用remember()方法。

但这需要每个使用模型的Repository都创建一个生成器,并且开发人员记住使用remember()方法。

我是不是错过了什么?有更好的方法吗?

我能想到的唯一方法是在Eloquent特定模型上重写newBaseQueryBuilder()方法,并在返回实例之前调用remember()方法,但感觉有点麻烦。

然而,我注意到执行更新操作不会清除缓存,所以感觉很没用,因为缓存数据可能会返回不再有效的值


对于B)

如果我有多个影响同一模型的存储库,由于缓存不能很好地清除,如果我们开始使用Cache Facade单独处理缓存,它将很快变得不可管理、不可扩展并且容易出现错误。

阅读一些帖子和博客(http://culttt.com/2014/02/03/laravel-4-cache-service/)并且基本上有一些使用DecoratorPattern的好主意,所以我们对存储库进行了Cachable实现。

然而,尽管这是一个好主意,但问题伴随着a)中所述的问题而来,许多影响同一模型的存储库因此无法在不同的存储库中一致地处理对象的相同缓存值。


以下是我征求您可能想到或实施的解决方案,以及对我以下想法的意见的地方

想法

  • 继续使用Repository模式(但是,不要使其实现特定于ORM,即EloquentUserRepository
  • 使用数据访问对象模式包装模型
  • 我的DAO将反过来提供Eloquent特定的实现
  • 在DAO上使用Decorator模式来提供缓存层,由于该模式,它还允许我保持缓存逻辑的中心性和松散耦合性
  • 使存储库使用DAO
  • 使用服务提供商,根据对象的不同,我可能会有不同的缓存机制(静态数据将使用APC,而更易失性的数据将在Memcache上,其他数据可能在Membase上)

感谢您的帮助和意见。

Jeffrey Way做了很多测试,并为laravel写了很多关于这个主题的文章。这是我为在模型中进行测试而遇到的一篇文章。这可能有帮助,也可能没有帮助。-http://code.tutsplus.com/tutorials/testing-like-a-boss-in-laravel-models--net-30087

https://www.youtube.com/watch?v=ajoFwWwSHTI