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类
Oct 09 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
PHP SOCKET编程详解
May 22 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
php png失真的原因及解决办法
Nov 17 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版(4)
2006/10/09 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
JS文本框不能输入空格验证方法
2013/03/19 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
ionic中列表项增加和删除的实现方法
2017/01/22 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
小程序数据通信方法大全(推荐)
2019/04/15 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python集合常见运算案例解析
2019/10/17 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
会计求职信范文
2014/05/24 职场文书
先进个人评语大全
2015/01/04 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
红色经典电影观后感
2015/06/18 职场文书
小学大队长竞选稿
2015/11/20 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Python OpenCV 图像平移的实现示例
2021/06/04 Python
Linux系统下安装PHP7.3版本
2021/06/26 PHP
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技