什么是MVC模式?
MVC模式是现在网站和Web应用程序主要架构模式,进化到现在,原始的MVC已经不多见了,陆续增加了许多模块,逐步成为MVC的标准配置。
为了不至于太过突兀,我还是简单的介绍一下,后面的文章可能也会提到。
M,model,模型,可以理解成领域对象,也就是抽象化了的人和物,比如women, product, order等。
V,view,视图,指呈现给用户的界面,例如产品详情,产品列表,订单详情等。
C,controller, 控制器,指的是如何根据用户的请求,来调用系统相关的功能,最后将结果展现给用户,它通常操作的就是M和V两个对象。比如用户查询关于“空调”的产品列表,product_controller这个控制器就会调用相应的query方法,返回一个product_list_view,在这个视图中,将会呈现包含“空调”的产品列表。
那MVC模式又是怎么来的呢,目前为什么这么流行?以下是笔者自己的理解。
在Web混沌时期,大部分都是静态网站,网站文件是由纯html代码构成的,比如我访问空调列表页面,就会有air_conditioner_1.html,为什么文件中有一个_1呢?因为是静态页面,一页无法全部显示列表时,只能分页成多个文件。
后来动态网站产生了,它是以asp, jsp, php等文件后缀作为页面文件,同样是列表,现在不用再手动编写各个分页了,形如product_list.php?query=air_conditioner&page=1,表示我要显示空调列表的第一页。
动态页面流行后,可操作的空间大大增加了,于是著名的三层架构理论诞生了,记得当时那么时尚,每个面试web开发的,言必三层架构。它指的是表现层,业务逻辑层,数据层三层构成整个网站,具体还有很多变种。这时跟MVC就有点接近了,表现层和逻辑层与VC两个模块对应,数据层大致可以跟M对应上。数据层有些观点说不包含数据库,只是数据操作代码,但笔者认为应该包括才比较完整,否则光数据操作代码太过于单薄,分离出来一个独立的模块价值不大。
那三层模式和MVC模式究竟主要区别是什么呢?
还是空调列表页面,假如使用三层模式,用户首先访问的是表现层,表现层会调用业务逻辑层,逻辑层根据表现层传回的query参数,调用数据层获得数据,最后返回给表现层,表现层负责组织出列表页面,呈现给用户。
可见,这种经典架构的处理逻辑是线性的,而对于MVC模式,用户访问网站,首先会遇到一个分发器,分发器判断用户需要得到什么,然后调用控制器,控制器直接把装配好的视图呈现给用户,这里“分发器”就是我们今天的主角Router。可见MVC主要以控制器作为驱动,而三层架构以表现层作为驱动。
给大家看一下MVC模式的轮廓是怎样的:
简单说一下MVC的好处:
- 重用度高,一个控制器可以执行多种任务,比如air_conditioner_controller既可以显示列表,又可以显示详情,甚至可以作为其他api的无界面输出。理论情况下,Model可以跨平台移植,比如web站点的,可以移植到ios后端应用,但在企业级应用中,笔者认为不太可能。
- 重用度高,自然耦合度就比较低了,我们甚至可以把视图和控制器的开发人员分开。
MVC架构中,为什么要使用router?
- 首先,url的定义更加自由,降低了规范化的难度。上面提到的网站最初时期的html页面,可以定义在路由中,比如air_conditioner_list_p1.html,可以映射到控制器处理,从而动态化。而url的静态化,不仅人工可读,而且便于搜索引擎优化。
- 隐藏了服务端文件的路径,更加安全,同时人性化。比如login.php这样的页面就显而易见,而auth/login这样的url你甚至不知道后端用的是什么技术。
- 使用router, 使用户的请求和控制器,视图解耦,更加灵活,便于重用代码。
- 现代的router已经不是简单的路由分发,还包含部分逻辑功能,例如导航,中间件等。
Router的典型使用方法是怎样的呢?
前面说得太干,下面我们以Laravel来演示一下啥叫router。
今天就简单介绍到这里,下一篇,我们再详细展开router的用法。
原创版权,如引用需要注明来源和链接。