Laravel 对中大型项目的架构设计
来源:互联网 发布:二手貂皮大衣淘宝网 编辑:程序博客网 时间:2024/06/08 19:04
初学laravel时分两种 一种是乖乖的将程序填入MVC架构中 导致controller 和 model异常的臃肿 controller对model高度依赖导致项目在壮大时难以维护. 另一种是不知道程序该写在哪一个class内 毕竟传统 php都是一页一个程序.这里整理出最适合laravel的大型架构,兼具易维护 易扩充 容易重复使用的特点。
受RoR的影响,传统的认为 MVC 就是 model
, view
, controller
:
- Model 就是数据资料库。
- Controller负责调用 model 和view。
- View 就是 HTML。
假如按照传统的MVC概念 那么如下的需求应该怎么写呢?
- 发送 短信验证码,使用外部 API。
- 使用php调用api完成业务逻辑。
- 依照需求将格式显示。
- 依需求是进行对转换的格式进行内容筛选。
- 依需求显示不同資料。
其中 1, 2属于业务逻辑,而 3, 4, 5 属于显示逻辑,若依照一般对 MVC 的定义,model 是数据资料库,而 view 又是 HTML,以上这些需求都不能写在 model 和 view,只能勉強写在 controller。
因此將大量程序写在 controller,造成 controller 的臃肿和难以维护。
Model 过于臃肿
既然逻辑写在 controller 不方便维护,那我將逻辑都写在 model 就好了?
當你将逻辑从 controller 搬到 model 后,虽然 controller 变瘦了,但 model却臃肿,model从原本代表資料庫,現在变成还要负责业务逻辑和显示逻辑,結果更慘。
Model 代表数据资料库吗嗎?把它想成是 Eloquent class
就好,资料库应该在 repository 里,这也是为什么 Laravel 5 已沒有 models目录
,Eloquent class 仅仅是放在 app
根目录下而已。
中大型项目架构
那我们该怎么写呢?別将我们的思維局限在 MVC 內 :
- Model :仅仅是一个Eloquent class。
- Repository : 辅助 model,处理数据逻辑,然后注入到 service。
- Service : 輔助 controller,處理业务逻辑,然後注入到 controller。
- Controller : 接收 HTTP request,调用其他 service。
- Presenter : 处理显示,然后注入到 view。
- View : 使用 blade 將资料 绑定到 HTML。
通过上图我们发现 MVC架构其实还在 由于SOLID的单一职责与 依赖反转原则
- 我们将数据从model 分离出來,由 repository 辅助 model,将 model 依赖注入进 repository。
- 我们将业务逻辑從 controller 分离出來,由 service 辅助 controller,将 service 依赖注入进 controller。
- 我们将显示逻辑 view 分离出來,由 presenter 辅助 view,將 presenter 依賴注入进 view。
单元测试
由于现在将 model、view、controller 的相依物件都已经拆开,也都使用依赖,因此每个部分都可以单独的做单元测试,如要测试 service,就将 repository 加以 mock,也可以将其他 service 加以 mock。
Presenter 也可以单独的进行单元测试,将其他 service 加以 mock。
Conclusion
- 本文谈到的架构只是开始,你可以依照实际需求增加更多的目录和class,当你发现违法 SOLID原则,就大膽的將 class 从MVC拆开重构
原本地址 http://www.xuyuanchang.site/archives/98.html
欢迎关注我的个人博客 http://www.xuyuanchang.site
转载请注明地址
- Laravel 对中大型项目的架构设计
- 大型项目架构设计
- Laravel 的中大型專案架構
- 如何设计一个牛掰的大型项目架构?
- 如何设计一个牛掰的大型项目架构?
- 如何设计一个牛掰的大型项目架构?
- [架构] 大型网站架构系列之三 ---------------- 多对多关系的优化设计
- 大型J2EE项目中异常处理机制的设计
- 疯狂代码,大型网站架构系列之三,多对多关系的优化设计
- 大型网站架构系列之三,多对多关系的优化设计
- 大型网站的服务器架构设计
- 大型网站的架构设计详解1
- 大型网站的架构设计详解2
- 大型网站的架构设计详解3
- 大型网站的架构设计详解4
- 大型网站的架构设计与演进
- Java文萃:谈软件对项目架构设计的概论
- 大型网站架构设计
- CentOS压力测试工具Tsung安装、使用和图形报表生成
- 【VS开发】MFC运行时库与debug、release版本之间的配置关系
- 悲观锁和乐观锁
- Mac小技巧:快速查看指定应用程序的所有窗口
- Linux信号列表详解
- Laravel 对中大型项目的架构设计
- MySql与Sql Server Update语句
- 关于memcpy
- HDU 5880 Family View AC自动机
- 【Qt开发】QT对话框去掉帮助和关闭按钮 拦截QT关闭窗口的CloseEvent
- 算法导论(9)
- HZK16点阵字库程序
- Git:简介、诞生、集中式分布式、安装、创建版本库
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误