最近在检查项目代码的时候,发现有很多人并不能完全理解MVC,有些以为使用了面向对象就是MVC,有些将很多M层的东西写在了C层,从而造成了C层相当的臃肿,所以这里将我对MVC的一些总结写下来,仅供大家参考。
现在软件开发很多框架都使用的是MVC模式,M指的是模型,V是视图,C是控制器,MVC的目的就是使M和V分离,也就是将视图层和数据层进行解耦,提高代码的复用性。C存在的目的是确保M和V的同步,一旦M改变了,V也要相应的改变。
MVC的详细分工如下:
Model(模型)负责在数据库中存取数据。主要囊括了整个项目中的数据、业务逻辑和业务规则。通常,M层是MVC中代码量最大的,逻辑最复杂的,关于业务的大量业务逻辑也是在这里表示。M层一般要对输入的数据进行过滤、验证和规范化处理。M层可以提供有结构的数据,数组结构、队列结构、乃至其他Model等。 只要是与业务有关的都应该放在M层而不是C层,C只是简单的处理M与V层的关系。M的复用度在MVC中是最高。
View(视图)依据模型数据创建的,主要是将数据呈现在用户面前,一般以HTML为主。V层一般没有复杂的判断语句,只有简单的循环格式化语句;而且V层也不会直接改写M层;V层用的数据都是直接拿来用的数据。
Controller(控制器)负责从视图读取数据,控制用户输入,并向模型发送数据。如从M层查询数据,然后组装一定成格式的数据传给V层。C层就是火车站售票员,从数据库里取出数据组成火车票,然后交给V层。C层用于决定使用哪些Model,对Model执行什么操作,然后为视图准备哪些数据。所以像request相关的数据就应该放在C层,C层不对数据进行任何预处理,这些操作应该放在M层。
由于我们公司使用的是yii2框架,所以这里以yii2为例进行说明。
在项目中,是先有数据库再有model,通常最小单元的model就是根据数据库表生成的model,这种model在yii2中一般是继承了Active Record。
比如订单情景,如order(订单)表和goods(商品)表。对于平时简单的展示等功能,这两个model还是够用的。但是涉及到商品的添加、审核等复杂的功能时就不够用了。既然不够用我们就要扩展这个model。在添加商品的时候我们要对添加商品的表单进行验证,这个功能只有在添加表单的时候才使用,对于其他的时候是没用的,所以我们不能直接在goods这个model上添加,这个时候我们可以使用继承的方式:
public class GoodsForm extends goods {}
当在添加、修改商品的时候,我们就可以使用GoodsForm这个model了。