写Web程序时,常听人说“用MVC”,可一到真动手——比如要查个用户、存条订单,该把SQL或者ORM代码塞哪儿?不少人直接扔进Controller里,结果越写越乱,改个字段要翻三四个文件。
数据库操作,是Model的本职工作
MVC里的M,就是Model,它不光是几个属性的类,更是业务数据的“管家”。查库、写库、校验规则、关联逻辑……这些都该由Model层扛着。比如你有个用户登录功能,验证账号密码、读取用户角色、更新最后登录时间——这些动作全在Model里完成,Controller只负责“转达”和“分发”。
举个实际例子:用户提交登录表单,Controller收到请求后,只做两件事:
1. 拿到用户名和密码;
2. 交给UserModel去验证。
剩下的——查数据库、比对密码哈希、加载权限列表——都是Model内部的事。
别让Controller变“大杂烩”
见过这样的代码吗?
public function login() {
$username = $_POST['user'];
$pwd = $_POST['pwd'];
$pdo = new PDO(...);
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = ?');
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($pwd, $user['password'])) {
$_SESSION['uid'] = $user['id'];
redirect('/dashboard');
} else {
echo '登录失败';
}
}这段全挤在Controller里,看着快,但下次要加个“登录失败次数限制”,就得再往里塞查询、更新、判断……很快Controller就膨胀成几百行的“面条代码”。换成Model方式,Controller就清爽多了:
public function login() {
$result = UserModel::checkLogin($_POST['user'], $_POST['pwd']);
if ($result['success']) {
$_SESSION['uid'] = $result['user_id'];
redirect('/dashboard');
} else {
show_error($result['msg']);
}
}所有数据库细节,藏在UserModel::checkLogin()里面,Controller不关心用了PDO还是MySQLi,也不管密码是bcrypt还是argon2。
View和Controller都不该碰数据库
View(视图)只管展示,连SELECT都不该出现。有人图省事,在模板里直接写<?php echo $db->query('SELECT title FROM posts')->fetch()['title']; ?>——这等于把数据库裸奔在HTML里,换数据库、改表结构、加缓存?全得挨个翻模板。
Controller也不是数据库入口。它的职责很明确:接收输入、调用Model处理、决定跳转或渲染哪个View。就像餐厅服务员,只传菜、下单、报错,不炒菜、不备货、不洗碗。
所以下次写代码前,先问一句:这个操作,是“查/改/删数据”,还是“决定跳哪页”或“把数据塞进HTML”?前者找Model,后者各归各位,手一松,结构就稳了。