ThinkPHP5.0升级到5.1需手动调整钩子行为:tags.php必须置于application/tags.php并以return返回数组;run()方法参数不再支持引用传值;内置钩子参数类型更严格且部分已弃用;自定义钩子名须小写+下划线且避免与新增内置钩子重名。

ThinkPHP5.0 升级到 5.1 后,钩子行为基本能直接运行,但有几处关键差异必须手动调整,否则行为不执行、参数收不到、甚至静默失败。
tags.php 路径和返回格式必须改
5.0 允许把 tags.php 放在 app/tags.php 或 application/tags.php,而 5.1+ **只认 application/tags.php**,且必须是 PHP 文件,以 return 返回关联数组。
常见错误:升级后行为完全不触发,查日志也没记录——大概率是路径错了或没 return。
- 确保文件存在:application/tags.php
- 必须以 return 开头,不能只是 $array = [...];
- 类名命名空间必须用双反斜杠:'app\index\behavior\AuthCheck',单斜杠会报类找不到
run() 方法签名和参数传递规则变了
5.1 中 Hook::listen() 的第二个参数**不再支持引用传值**(&$params),所有传参都是值拷贝。
如果你原来在 run($params) 里修改了 $params['data'] 并期望下游行为能读到,现在会失效。
- 所有行为的 run() 方法必须声明为 public function run($params = null)
- 若需共享状态,改用 app('cache') 或全局静态变量(不推荐)
- 自定义钩子传参时,别再依赖“引用修改”,改用返回值或外部存储
内置钩子参数类型更严格,部分钩子已弃用
5.1 对几个常用钩子的参数做了明确约束,和 5.0 不兼容:
- app_begin:5.0 无参,5.1 传入 $dispatch(调度信息数组),类型为 array
- module_init:5.0 无参,5.1 传入当前 Request 实例
- view_filter:仍传 $content,但必须返回字符串,否则模板输出为空
- response_end 在 5.1 中被移除,改用 app_end 或中间件替代
自定义钩子必须显式 listen,且不能重名内置钩子
升级后很多人发现自定义钩子如 user_login 没反应,其实是名字撞了——5.1 新增了部分内置钩子名(比如 auth_check),或框架内部悄悄用了同名钩子。
- 自定义钩子名统一用小写+下划线,例如 after_user_register,避免 userLogin 或 AppInit 这类驼峰/大小写混用
- 触发前建议先检查是否注册成功:Hook::getListeners('after_user_register') 返回空数组说明没注册上
- 别在事务未提交时触发钩子查数据库,5.1 的模型事务隔离更严格,此时查不到刚 save() 的数据
5.1 的钩子机制表面兼容,实则参数传递、注册时机、错误反馈都更“硬”。最常被忽略的是 tags.php 路径和 run() 参数不可引用这两点,一动不动照搬 5.0 代码,90% 的问题出在这儿。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











