thinkphp5.1 框架钩子和行为用法实例分析


Posted in PHP onMay 25, 2020

本文实例讲述了thinkphp5.1 框架钩子和行为用法。分享给大家供大家参考,具体如下:

行为

ThinkPHP中的行为是一个比较抽象的概念,可以把行为想象成在应用执行过程中的一个动作。

在框架的执行流程中,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测、多语言检测等等都可以当做是一个行为,甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看成是一种行为,把这些行为抽离出来的目的是为了让你无需改动框架和应用,而在外围通过扩展或者配置来改变或者增加一些功能。

钩子

不同的行为之间也具有位置共同性,比如,有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置称之为钩子

当应用程序运行到这个钩子的时候,就会被拦截下来,统一执行相关的行为

一个钩子可以注册多个行为,执行到某个钩子位置后,会按照注册的顺序依次执行相关的行为。但在某些特殊的情况下,你可以设置某个钩子只能执行一次行为,又或者你可以在一个钩子的某个行为中返回false来强制终止后续的行为执行;一个行为可以同时注册到多个不同的钩子上,完全看应用的需求来设计。

设置钩子:

Hook::listen('钩子名称','参数','是否只有一次有效返回值');

除了钩子名称之外,其它参数都是可选的,注意5.1版本第二个参数不支持引用传值。

行为定义

行为类的定义很简单,一般来说只需要定义一个行为入口方法run即可

可以在行为方法中使用依赖注入

行为类并不需要继承任何类,相对比较灵活。如果行为类需要绑定到多个钩子,可以定义多个方法

行为绑定

行为定义完成后,就需要绑定到某个标签位置才能生效,否则是不会执行的。

使用think\facade\Hook类的add方法注册行为,例如:

// 注册 app\index\behavior\CheckLang行为类到app_init标签位
Hook::add('app_init','app\\index\\behavior\\CheckLang'); 
//注册 app\admin\behavior\CronRun行为类到app_init标签位
Hook::add('app_init','app\\admin\\behavior\\CronRun');

如果要批量注册行为的话,可以使用:

Hook::add('app_init',['app\\index\\behavior\\CheckAuth','app\\index\\behavior\\CheckLang','app\\admin\\behavior\\Cr

当应用运行到app_init标签位的时候,就会依次调用app\index\behavior\CheckAuthapp\index\behavior\CheckLangapp\admin\behavior\CronRun行为。如果其中一个行为中有中止代码的话则后续不会执行,如果返回false则当前标签位的后续行为将不会执行,但应用将继续运行。

闭包支持

可以不用定义行为直接把闭包函数绑定到某个标签位,例如:

Hook::add('app_init',function(){ 
  echo 'Hello,world!';
});

如果标签位有传入参数的话,闭包也可以支持传入参数,例如:

Hook::listen('action_init',$params);
Hook::add('action_init',function($params){ 
  var_dump($params);
});

直接执行行为

如果需要,也可以不绑定行为标签,直接调用某个行为,使用:

// 执行 app\index\behavior\CheckAuth行为类的run方法 并引用传入params参数
$result = Hook::exec('app\\index\\behavior\\CheckAuth',$params);

直接执行行为的时候,执行的是run方法,如果需要执行行为类的其它方法,可以使用

// 执行 app\index\behavior\CheckAuth行为类的hello方法 并引用传入params参数
$result = Hook::exec(['app\\index\\behavior\\CheckAuth','hello'], $params);

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
PHP 文件系统详解
Sep 13 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 PHP
深入PHP异步执行的详解
Jun 03 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
joomla数据库操作示例代码
Jan 06 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
php编程每天必学之表单验证
Mar 01 PHP
php json_encode与json_decode详解及实例
Dec 13 PHP
利用PHPExcel实现Excel文件的写入和读取
Apr 26 PHP
php集成开发环境详解
Sep 24 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 #PHP
php7 错误处理机制修改实例分析
May 25 #PHP
php7 list()、session及其他模块的修改实例分析
May 25 #PHP
php7 新增功能实例总结
May 25 #PHP
PHP强制转化的形式整理
May 22 #PHP
Yii 框架入口脚本示例分析
May 19 #PHP
Yii 框架使用数据库(databases)的方法示例
May 19 #PHP
You might like
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
html读出文本文件内容
2007/01/22 Javascript
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
jQuery学习总结之jQuery事件
2014/06/30 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
详解Nodejs内存治理
2018/05/13 NodeJs
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
前端如何实现动画过渡效果
2021/02/05 Javascript
Python 加密的实例详解
2017/10/09 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
想学python 这5本书籍你必看!
2018/12/11 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
基于Python解密仿射密码
2019/10/21 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
提高python代码运行效率的一些建议
2020/09/29 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
Android interview questions
2016/12/25 面试题
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
医药个人求职信范文
2014/01/29 职场文书
公司保密承诺书
2014/03/27 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技