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过滤危险html代码的函数
Jul 22 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
php字符串截取的简单方法
Jul 04 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
零基础php编程好学吗
Oct 11 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
javascript dom追加内容实现示例
2013/09/21 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
文明教师事迹材料
2014/01/16 职场文书
校园之声广播稿
2014/01/31 职场文书
幼儿教育感言
2014/02/05 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
廉洁自律承诺书
2014/03/27 职场文书
捐资助学倡议书
2014/04/15 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
React配置子路由的实现
2021/06/03 Javascript