type
status
date
slug
summary
tags
category
icon
password
MVC represents Model、View、Controller
在理解后端框架时,突然弄不清controller层和middleware层有什么区别,有点混淆,MVC架构之前也只是简单了解了一下,现在拿出来重新看看还是很有必要的,毕竟我也忘记View是一个怎样的概念了。
先抛砖引玉一下,controller可以作为middleware吗?
The Answer is YES !!!
📝 主旨内容
MVC是什么?
MVC架构是一种用于设计和开发软件应用的模式,尤其是图形用户界面(GUI)应用。MVC代表模型(Model)、视图(View)和控制器(Controller)。这种架构将应用分为三个主要的组件,目的是实现关注点分离。这样做可以让应用的用户界面和业务逻辑分离,从而使代码更容易管理和维护。
组件说明
- 模型(Model):
- 模型代表应用的数据逻辑。它直接管理数据、逻辑和应用的规则,通常是对数据库的直接映射。模型负责访问存储数据的逻辑,以及对数据的添加、修改、删除等操作。
- 模型不包含任何有关数据如何展示给用户的信息。
- 视图(View):
- 视图是用户界面的组成部分。它负责展示数据(即模型)给用户,并且确保用户界面是更新的。
- 视图通常是依据模型数据创建的,但它不直接进行任何处理逻辑。它只是展示数据,并发送用户命令(例如鼠标点击)给控制器。
- 控制器(Controller):
- 控制器作为模型和视图之间的中介。它监听来自视图的输入,并执行对模型的更新或处理,可能会导致视图的改变。
- 控制器接收用户的输入(通过视图),处理输入(可能涉及模型的更改),并通过视图反馈输出。
MVC的工作流程
- 用户通过视图层进行操作,操作的请求发送给控制器。
- 控制器解析用户的操作,确定需要调用模型的哪些操作来处理请求。
- 模型执行业务逻辑处理后,将数据返回给控制器。
- 控制器接收模型传来的数据,选择适当的视图。
- 视图使用模型数据,渲染展示给用户。
MVC的优点
- 关注点分离:MVC提供了清晰的应用逻辑和界面的分离,使得管理复杂应用更加容易。
- 促进模块化:可以独立地开发、测试和维护每个组件。
- 提高可复用性:由于应用逻辑和界面分离,开发者可以重用大量的代码。
- 灵活性:更改应用的视图不影响模型实现,反之亦然,这使得应用更加灵活。
Controller层的作用
在典型的MVC(Model-View-Controller)架构中,Controller层的作用主要是处理应用逻辑,它充当模型(Model)和视图(View)之间的协调者。Controller接收来自客户端的请求,决定使用哪个模型去处理请求,然后选择视图来展示处理结果。简而言之,Controller负责处理用户的输入,调用相应的模型进行数据处理,最后选择合适的视图进行显示。
- 请求分发:Controller层负责接收客户端的请求,并根据请求的类型(如GET、POST等)将其分发到对应的处理函数。
- 业务逻辑处理:Controller调用Model层的函数进行数据处理,如数据库的CRUD操作,并根据处理结果进行逻辑判断或计算。
- 视图渲染:根据业务逻辑的处理结果,Controller选择并渲染相应的视图或返回响应数据给客户端。
- 错误处理:Controller层也负责处理业务逻辑过程中出现的错误,并作出相应的响应。
区分中间件和Controller
虽然在技术上Controller层的函数可以作为中间件使用,但它们的目的和职责是有区别的:
- 中间件主要用于处理通用的任务,如请求日志记录、错误处理、身份验证等,它们通常在多个路由之间共享。
- Controller则专注于处理特定的业务逻辑,每个Controller通常对应于应用中的一个特定功能模块。
🤗 总结归纳
在设计应用程序时,保持清晰的职责分离是很重要的。这不仅有助于维护代码的组织性和可读性,还能提高代码的可重用性和可测试性。
关于中间件,它的分类其实有很多种,有专注于错误处理的,参数校验的,甚至还有一些可以返回给服务端信息的,以后有时间可以学习学习。
有关这篇博客的任何问题,欢迎您在底部评论区留言,我会在github邮箱中第一时间收到邮件,让我们一起交流~
- Author:Zachary_Yang
- URL:https://notion-next-git-main-little1ds-projects.vercel.app//article/mvc
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!