介绍tp5框架中的hook机制

发布时间 - 2021-05-08 00:00:00    点击率:

下面由thinkphp教程栏目给大家介绍tp5框架中的hook机制,希望对需要的朋友有所帮助!

1. 官方解释

行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为既可以独立调用,也可以绑定到某个标签中进行侦听,在官方提出的CBD模式中行为也占了主要的地位,可见行为在ThinkPHP框架中意义非凡。

2. TP5自带钩子(TP框架中已经埋好标签,我们只要配置实现相应的函数就可以用了)

  1. app_init 应用初始化标签位,在think\App.php的initCommon函数中Hook::listen(‘app_init’);没有接收参数。
  2. app_begin应用开始标签位,在think\App.php的run函数中,在加载路由和请求信息后执行。会接收一个参数,存储的是本次请求的调度信息。
  3. module_init 模块初始化标签位,在think\App.php的module函数中,在加载请求控制器之前执行,接收一个参数,存储请求信息。
  4. action_init 控制器开始标签位,在think\App.php的module函数中,在加载完控制器后,使用反射请求控制器之前执行。接收一个参数,是一个数组,第一个元素是请求控制器实例对象,第二个函数时要执行的控制器函数名。
  5. view_fileter 视图输出过滤标签位,在think\View.php的fetch函数中,接收一个参数,视图字符串。
  6. app_end 应用结束标签为,在think\App.php中run函数中,Hook::listen(‘app_end’);
  7. log_write 日志write方法标签位,在调用Log::wirte记录日志之前执行。接收一个参数,要写入的日志信息。
  8. response_end 响应结束标签为。在think\Response.php的send函数中,在响应客户端请求之后执行。

3. 钩子函数的注册和监听都依赖于think\Hook.php

4. 系统只带的钩子函数,我们可以在application\tags.php中注册,也可以使用Hook::add()来添加。

> 1. 官方文档数tags.php会自动加载,但是经测试我下载的tp5不会自动加载tags.php文件,所以就手动在think\start.php文件的App::run()->send();函数之前写了一行代码用于,注册tags文件中的钩子实现。代码为
"php
    // 加载Hook
    Hook::import(require APP_PATH . '/tags.php');
"
> 2. 也可以使用Hook::add和Hook::listen来添加自己的钩子函数。Hook::listen()相当于是标签位,Hook::add()则相当于是对标签位相应的实现。所以要确保Hook::add()在Hoo::listen之前执行,不然就没什么用处了。

5. 钩子函数的绑定。

钩子函数既可以单独绑定一个类,也可以绑定类中的一个方法,或者直接绑定一个匿名函数。当绑定到一个类时,如果类中有run函数,那就直接执行run函数,如果没有run函数,而有一个与钩子名一样的函数则会执行该函数。(注意:钩子函数是驼峰式命名,并且钩子函数名的优先级大于run函数的优先级)


# 绑定  # 可以使用  # 加载  # 我们可以  # 用了  # 自带  # 既可  # 就可以  # 自己的  # 类中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中新建站点并配置端口与IP地址?  如何在阿里云香港服务器快速搭建网站?  iOS验证手机号的正则表达式  PythonWeb开发入门教程_Flask快速构建Web应用  Android自定义控件实现温度旋转按钮效果  使用豆包 AI 辅助进行简单网页 HTML 结构设计  如何在景安云服务器上绑定域名并配置虚拟主机?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  如何在云主机上快速搭建网站?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  b2c电商网站制作流程,b2c水平综合的电商平台?  linux写shell需要注意的问题(必看)  Python制作简易注册登录系统  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  EditPlus中的正则表达式实战(6)  Laravel如何创建自定义Facades?(详细步骤)  如何用AWS免费套餐快速搭建高效网站?  如何在万网开始建站?分步指南解析  js代码实现下拉菜单【推荐】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何快速搭建安全的FTP站点?  如何在IIS7中新建站点?详细步骤解析  Bootstrap整体框架之CSS12栅格系统  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  WEB开发之注册页面验证码倒计时代码的实现  Laravel如何使用Livewire构建动态组件?(入门代码)  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  简历没回改:利用AI润色让你的文字更专业  动图在线制作网站有哪些,滑动动图图集怎么做?  在线教育网站制作平台,山西立德教育官网?  原生JS获取元素集合的子元素宽度实例  Firefox Developer Edition开发者版本入口  如何做网站制作流程,*游戏网站怎么搭建?  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  如何构建满足综合性能需求的优质建站方案?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  详解Android中Activity的四大启动模式实验简述  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  如何在万网主机上快速搭建网站?  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  php 三元运算符实例详细介绍  香港服务器如何优化才能显著提升网站加载速度?  JS去除重复并统计数量的实现方法  ,怎么在广州志愿者网站注册?