MVC架构简介
“MVC”已成为Web开发社区中日益流行的术语,但它究竟是什么意思呢?过去20年间,网站从简单的HTML页面加上少量CSS,发展成为由成千上万开发人员共同维护的极其复杂的应用程序。为了简化这些复杂Web应用程序的开发,开发人员使用不同的模式来布局项目,从而降低代码的复杂性,使其更易于维护。迄今为止,最流行的模式就是MVC,也称为模型-视图-控制器(Model-View-Controller)。该模式的目标是将大型应用程序拆分为具有各自特定功能的特定部分。为了更好地说明每个部分,我们来看一个用户向服务器请求特定页面的示例。
控制器
下图展示了遵循 MVC 架构的服务器端逻辑,该逻辑在收到客户端请求时执行。服务器会根据请求的 URL 将所有请求信息发送给特定的控制器。控制器负责处理来自客户端的整个请求,并告知服务器的其他部分如何处理该请求。它充当模型和视图这两个部分之间的中间人,因此不应包含太多代码。控制器收到请求后,首先会根据请求向模型查询信息。
模型
负责处理请求的所有数据逻辑。这意味着模型与数据库交互,并处理所有数据的验证、保存、更新、删除以及其他任何与 CRUD 相关的操作。控制器绝不应直接与数据逻辑交互,而应始终使用模型来执行这些交互。这意味着控制器无需关心如何处理发送和接收的数据,只需告诉模型该做什么,并根据模型的返回值做出相应的响应即可。
这也意味着模型无需操心处理用户请求以及请求成功或失败时的处理方式。所有这些都由控制器负责,而模型只需关注数据交互。模型将响应发送回控制器后,控制器需要与视图交互,将数据渲染给用户。
视图
只负责呈现控制器发送的信息。这意味着视图是一个模板文件,它会根据控制器发送的数据动态渲染 HTML。视图无需处理数据的最终呈现方式,而只负责信息的呈现。视图会将最终呈现的内容发送回控制器,由控制器负责将最终呈现的内容发送给用户。需要注意的是,这种设计的关键在于模型和视图之间互不交互。模型和视图之间的任何交互都通过控制器完成。
综合起来
如果我们考虑一下现实世界的应用,可以想想我们每天都在使用的网络应用,例如任何一款社交图片分享应用。假设用户向服务器发送请求以获取他们的照片。服务器会将该请求发送给处理照片的控制器。然后,该控制器会请求数据库中负责操作照片集合或表的模型返回所有照片的列表。模型会查询数据库以获取所有照片的列表,并将该列表返回给控制器。
如果模型返回的响应成功,控制器就会请求与照片关联的视图返回照片列表的呈现形式。该视图会从控制器获取照片列表,并将列表中的每个照片元素渲染成浏览器可以使用的任何 HTML 格式。这就是图片库的渲染方式。
控制器随后会获取该展示内容并将其返回给用户,从而结束请求。如果之前模型返回的是错误信息而非照片列表,控制器则会处理该错误,请求用于显示错误或返回的 HTTP 错误代码的视图。Web 用户最常看到的错误
是“404 未找到页面”。此时,控制器会将该错误展示内容而非图片库返回给用户。总而言之,模型处理所有数据,视图处理所有展示内容,而控制器则指示模型和视图执行哪些操作。这就是基本的 MVC 架构的核心思想,也是许多应用程序维护易于管理且结构清晰的代码库的关键所在。
