家里路由器后台改个宽带账号密码,顺手点开开发者工具看了眼网页请求,发现返回的 JSON 里带着一堆 user_id、status 字段——这玩意儿跟 MVC 有啥关系?其实不少人在写后台、调接口、甚至改路由器固件 Web 界面时,都会卡在同一个问题上:数据库操作该扔进 Model、View 还是 Controller?
先说答案:数据库操作只归 Model 层管
不是 Controller 负责查库,也不是 View 去拼 SQL,更不是把 db.query() 塞进按钮点击事件里。Model 就是专门干这个的:封装数据逻辑,对接数据库,提供 getUserNameById()、saveWanConfig() 这类方法。
举个宽带设置里的真实例子:你在路由器页面填完 PPPoE 用户名和密码,点保存。这时前端发 POST 请求到 /api/wan/save,后端 Controller 收到请求,只做三件事:
① 校验参数是否为空;
② 调用 Model 的 saveWanSettings(data) 方法;
③ 返回 success: true 或错误信息。
真正的数据库写入动作,就藏在 Model 里:
class WanConfigModel {
save(data) {
return db.execute(
'UPDATE wan_config SET username = ?, password = ? WHERE id = 1',
[data.username, data.password]
);
}
}为啥不能放 Controller?
有人图省事,直接在 Controller 里连 MySQL、执行 INSERT。短期看着快,等哪天要加个日志记录、换 SQLite、或者把配置同步到云端,就得翻遍所有 Controller 手动改——而 Model 层只要改一个 save() 方法,全站自动生效。
View 层连数据库连接都不该看见
有些老式 PHP 页面,HTML 里混着 mysql_query(),结果改个数据库字段名,整个页面报错。View 只负责“长啥样”:输入框怎么排、保存按钮变灰还是亮起、失败时弹哪行红字提示。它只接收 Controller 传来的 {success: true} 或 {error: '密码不能为空'},不问数据从哪来、存没存成。
说白了,MVC 不是教条,是帮你少踩坑的分工习惯。就像修宽带——运营商负责线路(Model),装维师傅接线配置(Controller),你盯着网页界面上那个绿色对勾(View)就行。谁该干啥,盯住了,代码才不容易乱套。