PHP框架MVC模式指Model处理数据与业务规则、View纯模板渲染、Controller调度请求与数据传递;三者职责严格分离,Model承载密码校验等业务逻辑,View禁止直连数据库或获取超全局变量,Controller仅协调不处理具体业务。

PHP框架不是“封装好的万能工具箱”,而是按约定组织代码的骨架结构,核心价值在于强制你把数据处理、请求响应和页面渲染这三件事分开做——不照着做,框架就跑不起来。
Model 层该放什么逻辑?
Model 不是数据库操作函数集合,它得承载业务规则。比如用户注册时,addUser() 方法里必须包含密码强度校验、邮箱格式检查、用户名唯一性查询,这些不能甩给 Controller 做。
- 常见错误:把 SQL 拼接、
mysqli_query()调用直接写在 Controller 里,Model 只剩一个空类 - 正确做法:Model 类(如
UserModel)内部用protected $db持有数据库连接,所有增删改查都走自己的方法,不暴露原始连接对象 - 注意点:Laravel 的 Eloquent、ThinkPHP 的 Db 类都做了 Query Builder 封装,但底层仍是 Model 承担数据合法性判断,不是只转发 SQL
View 为什么不能调用 $_POST 或执行数据库查询?
View 是纯模板,它的输入只能来自 Controller 显式传递的变量。一旦你在 user/profile.php 里写 $_GET['id'] 或 new UserModel(),就等于绕过了整个 MVC 流程,后续换模板引擎或加缓存时会立刻崩。
- 典型现象:页面局部刷新失败、CSRF 验证失效、单元测试无法覆盖视图逻辑
- 安全影响:View 中直连数据库容易导致未授权数据暴露,比如忘记加权限判断就输出了
$user->password_hash - 实操建议:用
extract($data)或 Twig/Laravel Blade 的变量注入机制传值,禁止在 View 文件中出现任何 new、require、query 相关代码
Controller 的职责边界在哪?
Controller 是调度员,不是搬运工。它不该处理密码加密、文件上传校验、API 签名验证这类具体逻辑,这些必须下沉到 Model 或独立 Service 类。
- 容易踩的坑:
index.php或UserController.php里塞满正则匹配、时间戳转换、数组排序,导致 Controller 文件超过 500 行 - 参数差异:Laravel 的
Request对象自动过滤并提供$request->validated(),而原生 PHP 框架常需手动调用filter_input(),这点不统一容易漏校验 - 性能提示:Controller 中每多一次
file_get_contents()或curl_exec(),都会阻塞整个请求生命周期,应改为异步任务或提前在 Model 层聚合数据
真正难的不是分三层,而是每次写新功能时都得问一句:这段代码放在哪一层才不会让别人接手时想删库跑路。Model 决定“能不能做”,Controller 决定“要不要做”,View 只负责“做成什么样”——顺序错了,MVC 就只剩三个字母。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











