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 相关文章推荐
第七节 类的静态成员 [7]
Oct 09 PHP
php discuz 主题表和回帖表的设计
Mar 13 PHP
php编写一个简单的路由类
Apr 13 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
讲解WordPress开发中一些常用的debug技巧
Dec 18 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
Nov 05 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
Laravel Eloquent ORM 多条件查询的例子
Oct 10 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
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHPCMS忘记后台密码的解决办法
2016/10/30 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
为Javascript中的String对象添加去除左右空格的方法(示例代码)
2013/11/30 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
2014/10/16 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
sortable+element 实现表格行拖拽的方法示例
2019/06/07 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
利用Python实现图书超期提醒
2016/08/02 Python
python中lambda()的用法
2017/11/16 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
Python 合并拼接字符串的方法
2020/07/28 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
Django nginx配置实现过程详解
2020/09/10 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
中科软笔试题和面试题
2014/10/07 面试题
经理秘书找工作求职信
2013/12/19 职场文书
2014年租房协议书范本
2014/10/30 职场文书
会议开幕词
2015/01/28 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书