当前位置: 首页 > 后端技术 > PHP

推荐:简单易用的LaravelRepository包

时间:2023-03-29 15:07:21 PHP

什么是Repository模式,如何使用Repository模式这里不再啰嗦,请参考以下链接如何使用Repository模式?在Repository设计模式上搜索我laravel-china.orgMVC在今天仍然是一个流行趋势,但是大多数框架只提供基本的MVC架构。几年前,我们经常遇到Model过于臃肿的问题。写出来的时候就会变成类似于万能类,最后的人就真的变成了taker。不幸的是我就是其中之一。后来一直在思考如何让Model看起来清爽,功能更加简洁明了。(当时还不知道Repository),终于开始重构了。一把悲伤的眼泪。....Laravel最常见的用途是组合和Trait。刚开始接触Laravel的时候,感觉它的文档让人耳目一新。本以为是个简单的框架,结果一不小心掉坑里了,才发现被它的外表给骗了。但我也因此深深地爱上了它,是的,这不就是我一直在追求的吗?无限灵活,可替换,越研究代码越发现处处都是精髓。但是在Laravel中同样不可避免的基本MVC模式中,仍然存在上述问题。在最初的使用中,一直以为自己遵循了一个核心:以仓库层作为处理数据的基础,为Serivce、Controller等提供数据供给,通过Model获取仓库所需的原始数据。这样可以完全分离Model和Controller的依赖关系。它首先在Laravel中使用,通过定义大量的RepositoryInterface来注入、绑定和实现特定的Repository工作类。这是高度可替换的使用方法的理想选择。遇到的问题在实际开发过程中,Repository基本不会被替换,无数Interface带来的规范也带来了开发的烦恼。在Repository模式下,我们不断注入Model,每个方法都需要直接Model一次次查询数据集,却失去了外层链式调用的便利(这其实不合理,但也是有原因的))。经过中间的妥协,我们干脆在开发时去掉了Interface的约束,直接使用功能类来注入使用。这时候,简单性和方便性得到了极大的提升。如果非要更换的话,bind还是可以解决问题的。这样的开始持续了很长时间。但是链接调用之类的事情还是没有解决,为此我们开发了新的仓库包。https://github.com/crcms/repository投胎转世又开始玩微服务了,开始代码分离。当然离不开RPC。我们很高兴我们使用了Repository模式。通过开启对应的RpcRepository,我们可以快速的进行本地Repository的切换,受Interface约束。便捷的Repository包基础示例类TestRepositoryextendsAbstractRepository{/***@vararray*/protected$guard=['id','title','other'];/***@returnTestModel*/publicfunctionnewModel():TestModel{returnapp(TestModel::class);}/***@paramint$perPage*@returnLengthAwarePaginator*/publicfunctionpaginate(AbstractMagic$magic=null,int$perPage=15):LengthAwarePaginator{$query=$this->where('built_in',1);如果($magic){$query->magic($magic);}返回$query->orderBy($this->getModel()->getKeyName(),'desc')->paginate($perPage);}/***@paramint$name*@paramint$title*/publicfunctionupdateName(string$name,string$title){$this->getModel()->where('name',$name)->更新(['标题'=>$标题]);}}超好用的魔法方法在多条件搜索中肯定会有很多判断,优雅度太低,比如:if($request->input('username')){$query->where('username',$username)}if($request->input('email')){$query->where('email',$email)}.......但通过QueryMagic方法我们可以轻松雅决地解决这些问题,示例:创建Magic类useCrCms\Repository\AbstractMagic;useCrCms\Repository\Contracts\QueryRelate;classMagTestMagic/extends***@paramQueryRelate$queryRelate*@paramint$id*@returnQueryRelate*/protectedfunctionbyName(QueryRelate$queryRelate,string$name){return$queryRelate->where('name',$name);}}/***@paramQueryRelate$queryRelate*@paramstring$title*@returnQueryRelate*/protectedfunctionbyTitle(QueryRelate$queryRelate,string$title){return$queryRelate->where('title','like',"%{$title}%");}/***@paramQueryRelate$queryRelate*@paramint$id*@returnQueryRelate*/protectedfunctionbyId(QueryRelate$queryRelate,int$id){r返回$queryRelate->where('id',$id);}}使用Magic(这里只是一个简单的例子):publicfunctionpaginate(array$condition,int$perPage=15):LengthAwarePaginator{return$query->magic(newTestMagic($condition))->orderBy($this->getModel()->getKeyName(),'desc')->分页($perPage);}开发这个包的更多的原因是,在这之前我并没有说明我想兼顾Model的灵活性和数据仓库的分离模式,找到我想要的(适合我的),所以这个仓库包是为此目的而开发。目前这个包已经在几个项目中使用,目前运行良好。以后打算兼容TP、Yii等高使用率的框架。目前只支持Laravel。更多详情,请移步github:https://github.com/crcms/repository最后,请原谅我着急的文字描述,希望对有需要的和面临和我一样困惑的人有所帮助。原文出处:crcms-blog