行为扩展必须写在app/tags.php,框架启动时仅从此文件读取事件绑定;tags.php须返回键为事件名、值为带完整命名空间的行为类全名(如App\Behavior\CheckAuthBehavior::class)的关联数组,且行为类必须有无参run()方法。

行为扩展必须写在 app/tags.php,写在控制器、中间件或模型里都无效——它不是普通方法调用,而是事件系统驱动的钩子逻辑。
行为类注册必须放在 app/tags.php
框架启动时只从这个文件读取事件绑定,其他位置定义的行为不会被自动加载。
-
tags.php必须返回一个关联数组,键是事件名(如'app_init'),值是行为类全名组成的数组 - 类名必须带完整命名空间,例如
App\Behavior\CheckAuthBehavior::class,不能写成CheckAuthBehavior或app\behavior\CheckAuthBehavior - 如果类文件路径是
app/behavior/CheckAuthBehavior.php,命名空间就得是App\Behavior,且类名严格为CheckAuthBehavior - 常见错误:
App\Behavior\CheckAuthBehavior已存在,但app_init事件始终不触发——八成是tags.php没返回数组,或返回了空数组、拼错了类名、漏了::class
run() 方法签名和执行时机很关键
行为类必须有 run() 方法,且不能带构造参数;它只在对应事件被 Hook::listen() 触发时才执行。
- 框架通过反射新建实例,
__construct()里不能要求传参,否则抛ReflectionException - 参数由事件决定:比如
view_filter会把$content传进来,而app_init不传任何参数 - 多个行为按数组顺序执行,后一个能拿到前一个的返回值(如果事件设计支持返回值传递)
- 想确认是否注册成功?调试时跑
Hook::getListeners('app_init'),看返回数组里有没有你的类
别在模型里硬编码验证规则,用配置驱动更稳
模型字段校验规则写死在 beforeInsert() 里,加个新字段就得改代码;抽到配置里,维护和复用都更直接。
立即学习“PHP免费学习笔记(深入)”;
- 在
config/validate.php里定义规则数组,例如:'user' => ['full_name' => ['require', 'alphaNum']] - 读取时机很重要:不能在模型
initialize()里直接用Config::get(),因为此时配置可能还没加载完;建议在具体方法中按需读取,或用config('validate.user')助手函数 - 注意命名空间:用
Config类要use think\facade\Config,否则报错找不到类 - 性能上没明显开销,但避免在高频事件(如
view_parse)里做复杂配置解析
最容易被忽略的是:行为不是“定义即生效”,它依赖事件触发点是否存在 Hook::listen() 调用。框架源码里没写那句,再正确的 tags.php 也白搭——得翻下核心启动流程或查文档确认该事件是否内置支持。



















