龙空技术网

网站MVC模式,除了MV和C外,还有哪一个重要的模块?系列1

Zoe的01世界 114

前言:

今天同学们对“mvc模式作用”大约比较注重,小伙伴们都想要分析一些“mvc模式作用”的相关内容。那么小编同时在网络上搜集了一些对于“mvc模式作用””的相关知识,希望各位老铁们能喜欢,看官们一起来了解一下吧!

什么是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。

<?php// 以经典的hello, world开场。// 使用闭包的形式(匿名函数)// 访问网站的首页(省略index.html), 返回hello, worldRoute::get('/', function(){	return 'hello, world';});// view出场了,你甚至不需要controller就实现了页面显示。// 访问/air_conditioner,返回对应的视图。Route::get('air_conditioner', function(){	return view('air_conditioner');});// 最后是比较“正宗”的定义,访问控制器方法。// 访问/air_conditioner, 由控制器AirConditioner的list方法提供处理。Route::get('air_conditioner', 'AirConditioner@list');

今天就简单介绍到这里,下一篇,我们再详细展开router的用法。

原创版权,如引用需要注明来源和链接。

标签: #mvc模式作用