必须通过行为机制绑定到系统标签位才能执行权限校验等逻辑;tags.php须置于app/behavior/目录下,返回键为标签名、值为全类名数组的关联数组,类需按规范命名并实现public run($params = null)方法。

想在ThinkPHP 6.1中为应用注入权限校验、请求日志或模板内容替换等逻辑,必须通过行为(Behavior)机制绑定到系统预设的标签位,否则代码写得再完整也不会被执行。
确认行为定义文件位置与格式
ThinkPHP 6.1不再使用Application/Common/Conf/tags.php路径。行为注册文件必须放在app/behavior/目录下,且文件名固定为tags.php——不是tag.php,也不是Tags.php,大小写和拼写错误会导致整个文件被忽略。
该文件必须返回一个关联数组,键为系统标签名(如app_begin),值为带::class后缀的全类名数组。例如:
return [
'app_begin' => [App\Behavior\CheckAuthBehavior::class],
'view_filter' => [App\Behavior\ReplaceContentBehavior::class]
];
【若文件中存在任何echo、var_dump、print_r或注释外的输出,PHP include会失败,整个tags.php加载中断】
立即学习“PHP免费学习笔记(深入)”;
创建规范的行为类文件
在app/behavior/目录下新建CheckAuthBehavior.php文件。
命名空间必须严格匹配路径:namespace app\behavior;(注意反斜杠,不是点号或空格)。
类名必须与文件名一致,且以Behavior结尾,例如:class CheckAuthBehavior。
run()方法签名必须为public function run($params = null)——不能带类型提示,不能有构造参数,不能声明为static,框架通过反射无参实例化,【任何 __construct() 参数都会导致 ReflectionException】。
绑定行为到具体标签位
第一步:确定你要介入的执行阶段。常用标签位按执行顺序排列如下:
① app_init → 应用初始化前
② app_begin → 应用开始时(路由解析后、控制器执行前)
③ action_begin → 控制器动作执行前
④ view_parse → 模板解析过程中
⑤ view_filter → 视图输出前过滤
⑥ app_end → 应用完全结束前
第二步:根据需求选择标签位。例如,要做全局登录校验,选app_begin;要做模板关键词自动替换,选view_filter;要记录请求耗时日志,选app_end。
第三步:将类名填入tags.php对应键的数组中。多个行为可共用同一标签位,执行顺序按数组索引从左到右。
验证行为是否生效
方法一:在任意控制器方法中插入以下代码并访问对应接口:
dump(\think\facade\Hook::getListeners('app_begin'));
方法二:检查输出数组是否包含你注册的类全名字符串,例如'App\Behavior\CheckAuthBehavior'。
方法三:若输出为空数组,说明tags.php未被加载——检查CONF_PATH常量是否指向app/config/目录,且该目录下是否存在tags.php文件,同时确认PHP进程对文件有读取权限。
注意:行为不是“定义即触发”,它只在框架执行Hook::listen('app_begin')时才调用run();翻阅thinkphp/library/think/App.php源码,确认该标签位确实存在调用点,否则再正确的配置也无效。



















