Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用存储库模式(有雄辩的支持)和缓存的Laravel 4可扩展设计_Php_Caching_Laravel 4_Repository Pattern_Dao - Fatal编程技术网

Php 使用存储库模式(有雄辩的支持)和缓存的Laravel 4可扩展设计

Php 使用存储库模式(有雄辩的支持)和缓存的Laravel 4可扩展设计,php,caching,laravel-4,repository-pattern,dao,Php,Caching,Laravel 4,Repository Pattern,Dao,大家好,StackOverflow用户,希望你们能帮我提供一些答案和意见 我正在设计一个系统,选择Laravel4作为框架。 由于ActiveRecord的复杂性,我在尝试单元测试时遇到了一些问题,Laravel通过雄辩的方式使用了ActiveRecord 考虑到这一点,我发现Repository模式是一个很好的替代方案,同时它还允许我创建自己的库集,这些库可以轻松分离,并且不依赖于框架 说到这里,我开始使用它,它允许很好的单元测试集成和IoC的使用。(我创建了自己的普通旧对象,并在存储库中映射

大家好,StackOverflow用户,希望你们能帮我提供一些答案和意见

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

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

说到这里,我开始使用它,它允许很好的单元测试集成和IoC的使用。(我创建了自己的普通旧对象,并在存储库中映射了雄辩的模型和这些实体)

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

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

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

但这要求每个使用模型的存储库都创建一个构建器,开发人员记住使用
memory()
方法

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

我能想到的唯一方法是重写雄辩的特定模型上的
newBaseQueryBuilder()
方法,并在返回实例之前调用
memory()
方法,但感觉有点不对劲

但是,我注意到,执行更新操作不会清除缓存,因此感觉它毫无用处,因为缓存数据可能会返回不再有效的值


(B) 如果我有多个存储库影响同一个模型,因为缓存不能很好地清除,如果我们开始使用
cache
Facade单独处理缓存,它将很快变得不可管理、不可扩展,并且容易受到bug的影响

阅读了一些文章和博客(),并且有一些好的想法,基本上是使用装饰器模式,因此我们对存储库进行了一个可计算的实现

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


在这里,我要求您提供您可能已经想到或实施的解决方案,以及对我的以下想法的意见。

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


感谢您的帮助和意见。

Jeffrey Way做了很多测试,并为laravel写了很多关于这个主题的文章。这是我在模型测试中遇到的一篇文章。这可能有帮助,也可能没有帮助

这帮助我决定: