MVC模式三大组件:模型、视图、控制器到底在干啥?

你写过网页,也改过按钮颜色、加过表单,但有没有发现:一改样式,逻辑就乱;一调数据,界面就崩?这时候,老程序员常会甩出一句——“你这没分清 MVC 啊”。

先别被名字吓住

MVC 不是高深算法,它就是一套“分工合作”的日常规矩。就像开一家小餐馆:厨师管做菜(数据处理),服务员端盘子(展示内容),店长协调订单和后厨(业务调度)——三个人不混岗,谁出问题找谁。

模型(Model):数据的主人

Model 是程序里真正“干活”的部分,负责存数据、查数据、改数据、验证数据。它不关心你是用手机看还是电脑看,也不管按钮是蓝色还是绿色。

比如用户登录时,Model 就要检查账号密码是否匹配数据库,生成 token,记录最后登录时间——这些事,它自己闭环搞定。

class User {
static findByEmail(email) {
return db.query("SELECT * FROM users WHERE email = ?", [email]);
}

static updateLastLogin(id) {
return db.query("UPDATE users SET last_login = NOW() WHERE id = ?", [id]);
}
}

视图(View):纯展示员

View 只做一件事:把数据变成人能看懂的页面。它像一张空白菜单,等着 Model 填菜名、价格、图片,然后原样印出来。它不会去查数据库,也不会点“提交”就自己发请求。

一个登录页的 View,可能就长这样:

<form action="/login" method="post">
<input type="email" name="email" placeholder="邮箱" value="<?= $userEmail ?? '' ?>">
<input type="password" name="password" placeholder="密码">
<button type="submit">登录</button>
</form>

它只管渲染,连“密码错啦”这种提示,也是 Controller 告诉它才显示的。

控制器(Controller):中间传话筒

Controller 是连接 Model 和 View 的“快递员+调度员”。用户点登录,它收请求 → 找 Model 验证 → 拿结果 → 决定跳首页还是弹错误 → 把数据交给 View 渲染。

没有 Controller,Model 和 View 就像两个方言不通的人,对着喊半天也对不上号。

function loginAction() {
$email = $_POST['email'];
$password = $_POST['password'];

$user = User::findByEmail($email);
if ($user && password_verify($password, $user['password_hash'])) {
User::updateLastLogin($user['id']);
render('home.php', ['user' => $user]); // 给 View 数据
} else {
render('login.php', ['error' => '邮箱或密码错误']);
}
}

为啥非得分这么细?

你改个按钮颜色,不用动查数据库的代码;后端换数据库,只要 Model 接口不变,View 和 Controller 几乎不用动;测试登录逻辑?直接喂数据给 Controller,不用真点按钮、填表单。分工清楚了,改得快,查得准,接新人也容易上手。

不是所有小项目都得死守 MVC,但一旦页面多、功能杂、多人协作,这三块分开了,真能少掉一半抓狂时刻。