ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[danger]tp6移出了钩子类,可以用更强大的事件达到同样的目的 [模型事件 · ThinkPHP5.0完全开发手册 · 看云](https://www.kancloud.cn/manual/thinkphp5/135195) [请求-方法注入 · ThinkPHP5.0完全开发手册 · 看云](https://www.kancloud.cn/manual/thinkphp5/168102) 数据库操作-查询事件 模型-事件 模型的关联定义方法必须采用驼峰法(小写字母打头)命名规范,但关联调用可以支持驼峰和小写方式。 行为类的方法必须使用驼峰法命名,如果你使用了钩子位作为行为执行方法入口,请修改为驼峰法,例如`app_init`钩子位对应的行为方法名应该是`appInit`。 如果你使用了Query类的`fetchClass`方法自定义数据集返回对象的话,请改为在模型中设置`resultSetType`属性,数据库类不再支持自定义查询数据集对象(只支持数组和系统的`think\Collection`数据集对象) 参看扩展-行为章节 为(Behavior)是在预先定义好的一个应用位置执行的一些操作。类似于`AOP`编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类`AOP`编程的思想。所以,行为通常是和某个位置相关,行为的执行时间依赖于绑定到了哪个位置上。 要执行行为,首先要在应用程序中进行行为侦听,例如: ~~~ // 在app_init位置侦听行为 \think\Hook::listen('app_init'); ~~~ 然后对某个位置进行行为绑定: ~~~ // 绑定行为到app_init位置 \think\Hook::add('app_init','\app\index\behavior\Test'); ~~~ 一个位置上如果绑定了多个行为的,按照绑定的顺序依次执行,除非遇到中断。 ##### 步骤: **1\. 钩子绑定行为** application目录的tags.php文件,任意选择一个系统内置钩子进行行为绑定。 注意格式,比如你要绑定的行为类的是`app\index\behavior\AopTry`,格式要和下图所示相同 ``` // 应用初始化钩子 'app_init' => [ 'app\\index\\behavior\\AopTry' ], return [ 'app_init' => [ 'app\index\behavior\AopTry' ], ]; ``` **2\. 创建行为类** ``` index目录创建behavior文件夹,behavior目录下创建AopTest.php类文件。 namespace app\index\behavior; class AopTry { public function run($params){ echo '我是index模块下app_init钩子绑定的行为————AopTest'; } } ``` 上面这种形式可以最快实现钩子绑定行为,特别需要注明的是: AopTry行为类的的方法名,如果你只需要定义了一个行为方法的话,可以取名为`run`。 否则的话,方法名就是钩子名称的驼峰命名(首字母小写)。 所以,上面的例子里面其实方法名也可以取`appInit`。 ### 监听自定义钩子 ##### 步骤: **1\. 钩子绑定行为** application目录的tags.php文件,任意选择一个系统内置钩子进行行为绑定。 这一步和之前**最低成本使用**一致,不做描述。 **2\. 创建行为类** ``` namespace app\index\behavior; class AppLove { public function run($params){ echo '我是app_love钩子的行为,yeah'; exit; } } ``` **3\. 控制器监听钩子** 1)引用think\\facade\\Hook; 2)使用Hook::listen(‘钩子名’)监听。 ``` namespace app\index\controller; use think\facade\Hook; class Index { public function index() { // 监听钩子 Hook::listen('app_love'); ..... } } ``` 动态绑定行为 步骤: 1. 控制器动态绑定行为 主要使用到了Hook::add('钩子名','行为类'),这里需要特别注意第二个参数和前面最低成本使用的格式是一样的。 其实这一步做的工作就是上面2个例子在tags.php做的动作,而且个人认为把绑定行为的动作写在tags.php会更加方便日后查问题。 2. 控制器监听钩子 这里和监听自定义钩子例子的一致,不做赘述。 3. 创建行为类 这里和监听自定义钩子例子的一致,不做赘述。 ``` use think\facade\Hook; class Index { public function index() { // 1.动态绑定行为 Hook::add('app_love','app\index\behavior\AppLove'); // 2.监听钩子 Hook::listen('app_love'); ... } } ```