thinkphp面试重实践而非版本记忆,聚焦路由中间件注册、模型save()失败原因、validate()静默跳过、事务回滚失效、路由斜杠匹配及cli/web缓存差异等真实坑点。

ThinkPHP 面试里真不考“TP 有哪些版本”,而是盯着你写过的代码问:路由没生效是不是因为中间件没注册?模型 save() 返回 false 到底是验证失败还是 SQL 报错?这些才是实际踩过坑的人才答得准。
为什么 validate() 不报错但数据没进库?
常见现象:调用 validate() 后 save() 返回 false,但没看到验证错误信息,日志也没报错。
- 默认验证失败时只返回
false,不抛异常,也不自动设置错误信息 —— 必须手动调用getError() - 如果用了场景(
scene('edit')),但模型里没定义对应场景规则,验证会直接跳过,看似“通过”实则没校验 -
validate(true)是开启自动验证,但 TP6 中已废弃,TP6.1+ 应改用validate('rule_name')或注入Validate实例 - 验证规则中字段名必须和提交数据的键完全一致(区分大小写),比如表单传
user_name,规则却写username,就会静默跳过
Db::transaction() 回滚失效的三个典型原因
事务看起来执行了,但出错后数据还在,回滚像没发生。
- 混用了
Db和模型操作:模型默认用自己连接,Db::transaction()只包裹Db查询,对UserModel::create()无效 —— 统一用Db或统一用模型 +startTrans()/commit()/rollback() - 事务内调用了含独立事务的方法(如某些支付 SDK 的回调处理函数),子事务提交会提前释放锁,导致外层回滚失效
- MySQL 表引擎不是 InnoDB:MyISAM 不支持事务,
Db::transaction()调用无效果且不报错,检查SHOW CREATE TABLE user确认引擎
路由变量带斜杠(/)时 404 怎么解?
想匹配类似 /article/2023/04/01 这种路径,但定义 Route::get('article/:date', ...) 一直 404。
-
:date默认不匹配/,需显式声明为闭包正则:Route::get('article/<date:>', ...)</date:> - TP6.0.9+ 支持通配符
*,但:id*是匹配多段,不是任意字符;真正要接带斜杠的变量,必须用尖括号正则语法 - 如果用了多级模块绑定(如
route_bind.php中绑定了admin模块),而请求路径未带模块前缀,路由调度器可能根本没走到你的规则
cache() 在 CLI 和 Web 下行为不一致?
命令行跑 php think test 缓存正常,浏览器访问同个逻辑却读不到缓存,或反过来。
- CLI 和 Web 是两个独立进程,共享缓存驱动(如 file、redis)时 key 冲突少,但 file 驱动下 cache 目录权限不同(www-data vs 当前用户)会导致写入失败
- TP 默认 CLI 环境禁用模板缓存,但业务缓存不受影响;真正要注意的是
config('cache.default')在不同环境配置是否一致,尤其path(file)、host(redis) - 使用
cache('key', $val, 3600)时,若$val是对象或闭包,file 驱动会序列化失败(提示unserialize(): Error at offset),建议只缓存数组、字符串、数字
TP 的“约定大于配置”在面试里最易被当软柿子捏 —— 它省掉的那几行代码,往往就是 debug 半天的起点。比如 model->save() 失败不报错、cache() 在 CLI 下写入但 Web 下读不到,这种细节不亲手 deploy 过两套环境,光背文档真答不准。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











