在说 MVC 架构以前,先说说PHP框架吧。不少不少学完PHP语言的人,面对的就是PHP各类各样的框架。什么TP啊、Yii啊、CI啊,还有很流行的laravel啊等等。php
他们的大部分都会说本身是基于 MVC 的架构,接着你得试着去理解 MVC 的逻辑,并尝试着用这样的逻辑去构建一个网站,而后会说 MVC 真香~前端
不少 PHP 的面试中,可能会问关于 MVC 的问题,好比 MVC 究竟是什么意思,怎样理解这种架构。然而不少人的理解是 model 是模型,他对应着数据库中的表结构;view 对应着页面,用于展现;controller 主要用来写各类逻辑,关联数据和页面的显示。vue
以上回答基本上没有问题,但一个网站的结构真的有那么简单么?显然不是laravel
在说以前,首先让咱们了解一下设计模式的一种:中介者模式。一个形象的理解就是:港行插头和国行插头的转接头。面试
在 MVC 架构中 controller 就是这个转接头。它只负责把 model 中的数据转接给 view,对于访问者来讲,他们是看不到 model 中保存的真实数据的。从另一个角度来讲,这种中介者模式能够很好的将两层数据进行友好的通讯。数据库
这种模式真的那么好么?随着业务逻辑的愈来愈复杂,会发现 controller 中的代码愈来愈多,甚至本身都不肯去调整和优化冗余代码。编程
但从宏观上来讲,网站无非是请求多一些,表单多一些,页面多一些啊,其余也没什么了,为何会这样呢?后端
没错,就是由于这样或那样的东西比较多,致使 controller 中每一个方法都很长,那么能想到的解决方法就是拆分。设计模式
若是用过 yii 框架,那么你会知道最简单的办法是加一个请求form层,代码以下:架构
class AuthController { public function login() { $FLogin = new loginForm(); $FLogin->save(); } } // 通常在独立的文件夹中 class loginForm { public function __construct() { $post = $_POST; } public function save() { } }
以上的就是解决 controller 中 form 表单的问题,这个问题基本上能缓解不少代码问题。
从解决 form 层来看,其实有不少相似的问题都能解决。咱们知道前端有个叫作 vue.js 的框架,它里面提到一个概念叫作 MVVM 模型。
其实在展示复杂页面的时候,后端在对外输出数据时,彻底也能够采用这玩意进行数据输出。至于如何创建这样的一个模型,那就具体得看业务逻辑了。
这里简单拿用户中心举个例子,由于每每这里不只仅须要一个表的数据:
class AuthController { public function userCenterAction() { return new userVM(); } } class userVM { public $user; public $orders; public $other; public function __construct() { $this->user = $this->getUser(); $this->orders = $this->getOrders(); $this->handle(); } private function getUser() { return NULL; } private function getOrders() { return NULL; } private function handle() { } }
以上代码中,有个 VM 层,能够将相关获取数据的代码放在各自的方法中,而后在 handle 方法中自由组合。这样在 controller 中的代码也很是便于管理。
再想一想,有没有能够封装的其余层呢?实际上是有的,好比 request 层,还有常常被框架封装好的 validate 层,还有 laravel 中比较流行的 Middleware 层等等。只能说系统越复杂,层越多。
每一个复杂系统的背后都蕴含着高级开发工程师和架构师的设计思路。以上说那么多,不知道读者可否理解这些东西,就拿以上代码来讲,里面就蕴含着另外一种设计模式:建造者模式。
代码写多了,也就知道其中蕴含的道理了。当一个新框架诞生后,关注点从学习这个框架,慢慢变成了这个框架是如何设计的,解决什么样的问题。哪些地方用了比较好的技术和方法,从中能收获到什么。一些地方的设计思路是什么样的,有么有更好的设计,为什么我能想到,对方想不到呢,是否是我遗漏了什么。
前几年使用过各类 PHP 框架,小到 CI,大到 Symfony。不用那么多框架,也体会不到这些东西。学习编程其实和英语同样,没什么捷径能够走。
多写,多想,多练......
以上