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 接口类与抽象类的实际作用
Nov 26 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
php 抽象类的简单应用
Sep 06 PHP
30 个很棒的PHP开源CMS内容管理系统小结
Oct 14 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
将php数组输出html表格的方法
Feb 24 PHP
PHP与MYSQL中UTF8编码的中文排序实例
Oct 21 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
Sep 11 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字符串截取问题
2006/11/28 PHP
php 前一天或后一天的日期
2008/06/28 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
js null undefined 空区别说明
2010/06/13 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
python实现基本进制转换的方法
2015/07/11 Python
Python实现二叉搜索树
2016/02/03 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
Python中的连接符(+、+=)示例详解
2017/01/13 Python
使用Python对MySQL数据操作
2017/04/06 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
python collections模块的使用
2020/10/16 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
机械设计专业应届生求职信
2013/11/21 职场文书
白酒业务员岗位职责
2013/12/27 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS
java开发双人五子棋游戏
2022/05/06 Java/Android