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

Laravel设计模式实战分享

时间:2023-03-29 17:14:44 PHP

MVC是Laravel自带的,大家或多或少都会用到。今天我们不讲MVC,而是针对大中型项目的一些设计思路。前言虽然标题说是设计模式,但是我不打算讲单例,策略,工厂。不知道为什么,每次看到这些字,我就觉得昏昏欲睡。就个人而言,我发现这些模式在非Java语言中使用起来很尴尬。曾经尝试过在Unity项目中使用设计模式,但总觉得模式是为模式而存在的,根本起不到我想要的作用。今天在市图书馆找了一本讲PHP或者Laravel环境下设计模式的书,但是没找到。起点相信很多学习设计模式的人都和我一样。听说这东西很高档。但是我只学会了前三个,也就是上面的三个,剩下的都是在梦里学的。近两年来,我一直在思考如何将设计模式应用到实战中。最忌讳的是,在代码中强行使用某种模式,往往弄巧成拙,毁掉之前的代码。刚开始接触设计模式的时候,出发点是重构代码,以便更好的重用和测试。但直到最近,在我上一篇博文之前不久,我才弄清楚如何去做。在路上,Laravel自带了MVC,但是我现在的项目已经超过10000行了,MVC早就力不从心了。后来决定找一些架构设计,重新整理代码,成功找到这篇通俗易懂的博客,里面包含了三篇独立的文章,讲解了三种模式:Service、Repository、Presenter。但我太笨了,连这样都理解不了。一开始是硬着头皮写,写着写着,渐渐明白了。在这个过程中,我发现了Laravel-5.3-Repository,并使用命令行创建了一个存储库文件。稍作修改,我可以更改命令来创建服务文件。而laravel-auto-presenter,可以直接将presenter对象注入到模型中,作为模型原有属性的替代(比如重写默认icon属性,附加img标签等)。但是这个库不支持自定义函数,只能用来替换以后的属性。最后,还有这个库laracasts/presenter。这是我目前正在使用的。它用于特征模式。它通过调用$foo->present()->customContent()来使用。只能调用自定义函数,不支持重写。有属性。结尾?今天写到这里,我突然明白了一件事。据说repository模式可以方便测试,我现在才明白怎么做。在controller或者service中调用repository的时候,调用的时候一定要传入变量,这样后面写单元测试的时候,可以只通过变量来测试repository是否正确,而不是通过传入参数每次都要求测试。也就是说,repository基本上是作为一组静态函数来使用的。希望大家在具体的项目中讨论如何设计。我也在学习阶段。欢迎回复交流。