行为整理链接

浅谈PHP中的钩子

钩子相当于一个插件,在某些执行顺序上插入进去。

行为可以在写app接口中对所有请求执行到控制器前 执行用户权限判断,sign验证等,这样就不用在每个接口中判断了

注意事项
1.触发行为的关键方法是Hook类中的listen方法,它通过遍历某个行为标签下的所有行为,依次实例化并调用run方法
2.listen方法中,如果之前在配置文件中开启了DEBUG模式,则它会生成日志记录你的行为,这里面牵涉到3.很多的IO操作,所以你的项目完成时建议取消DEBUG模式以提升速度
3.listen方法中,允许传递参数且只允许传递一个参数(传多个可以用数组呢),不过这个参数是引用传值,所以只能传入变量,传入常量会报错
4.最后,Library\Think\Behavior.class.php,这个抽象类中只有一个抽象方法run(),在你的自己行为扩展中建议继承它,尽管这不是必须的,但是这样更加规范
listen()---->加载注册的标签(如targs.php里的)------->遍历注册标签的键取出值,并且依次实例化标签键的值存放的类--->执行run方法:
 

例子:

在应用或模块下建 behavior目录,目录内建行为类文件Test.php(以下以home模块为例)

namespace app\home\behavior;//注意应用或模块的不同命名空间
class Test {
public function run(&$params){
echo $params;
}
}

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

home模块下建tags.php文件将行为绑定绑定(注册)到app_init和zzzzz标签上

return [
'app_init'=> [
'app\\home\\behavior\\Test', //注意行为的命名空间(下同)
],
'zzzzz'=> [//自定义标签位
'app\\home\\behavior\\Test',
],
//.................
];

控制器方法内需要的地方侦听行为(比如在随便某个控制器的index方法中添加)

$params='ok';
\think\Hook::listen('app_init',$params);//参数为变量(下同)
\think\Hook::listen('zzzzz',$params);//自定义

访问这个index方法  输出  okok

例子2:比如我们想在首页加载广告:

1.在控制器中 Application->Home->Controller->IndexController.class.php

namespace Home\Controller;
use Think\Controller;
use Think\Hook;//引用Hook
class IndexController extends Controller {
public function index(){
        //手动注册行为 ad 是注册行为的名称 后面的是路径 接下来会说如何新建路径中的文件(也可以在targs.php中配置自动注册)
        Hook::add('ad','Behavior\\adBehavior');
        //触发行为 (这种是在控制器中触发行为,还有在html页面中触发行为的 接下来就会看到) $parnam 为想要带的参数 可以随便定义  
        //hook::listen('ad',$parnam);//我们不要在这触发而是在html模板上触发的话请注释这句
$this->display(); } }

在应用或模块下建 behavior目录,目录内建行为类文件Test.php(以下以home模块为例)

namespace app\home\behavior;//注意应用或模块的不同命名空间
class Test {
public function run(&$params){
//$arg为带过来的参数 可以在其中写入自己的业务逻辑 行为必须执行run
echo '我是一条'.$params['name'].'广告,'.$params['value'].'代言';
//在此介绍下,run必须的 ,细心的会在Think核心找到Behavior.class.php里面有这样一句操蛋的话 abstract public function run(&$params); 你懂的
}
}

公共函数文件封装下触发行为的方法:

function hooklisten($hook,$params=array()){
\Think\Hook::listen($hook,$params); //监听一个钩子
}

4、在模板中使用 Application->Home->View->Index->index.html 添加如下代码:

<body>
<h1>How to used?</h1>
{:hooklisten('ad', array('name'=>'AV','value'=>'*老师'))} //这个呢就是在页面中触发行为的方式了
</body>

thinkphp5 行为(钩子)扩展的更多相关文章

  1. ThinkPHP5 支付宝支付扩展库(超级简单,超级好用!)

    ThinkPHP5 支付宝支付扩展库, 一个静态方法的调用就可以实现,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单所有功能,而且是2017年7月20日最新版~我的想法是,调用一个静 ...

  2. thinkphp5 自动注册Hook机制钩子扩展

    Hook.php 文件已更新1.修复在linux环境下类的 \ 在basename 下无法获取到类名的问题2.修复linux 环境下无法使用hook::call 调用失败问题 请先安装thinkphp ...

  3. thinkphp5的钩子怎么用

    1.创建钩子行为 我们自己定义的标签位可以直接放在Think\Behaviors中,也可以放在应用目录中,比如说Home模块下,新建一个Behaviors的文件夹,在文件夹内新建: 标签名+Behav ...

  4. ThinkPHP5微信支付扩展库(超级简单, 超级超好用!)

    ThinkPHP5微信支付最新扩展库(2017年9月24日). 我的想法很简单,就是只需要调用一个静态方法就可以完成支付,查询,退款,查账等等, 无需重复造轮子, 专注自己业务!欢迎到Github查看 ...

  5. ThinkPHP5.0中Redis的使用和封装(原创)

    Redis是一种常用的非关系型数据库,主要用作数据缓存,数据保存形式为key-value,键值相互映射.它的数据存储跟MySQL不同,它数据存储在内存之中,所以数据读取相对而言很快,用来做高并发非常不 ...

  6. ci钩子

    钩子 - 扩展框架核心 CodeIgniter 的钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改 核心文件.CodeIgniter 的运行遵循着一个特定的流程,你可以参考这个页面的 应用程 ...

  7. 齐博x1模型里边钩子的创建与使用

    在模型里边的钩子创建与使用方法跟在控制器里边的钩子创建及使用方法是有所区别的在模型里边创建的钩子,你可以理解为执行一个函数,是无法调用模型里边的类的方法及属性的.比如系统文件\application\ ...

  8. 齐博x2模型里边钩子的创建与使用

    在模型里边的钩子创建与使用方法跟在控制器里边的钩子创建及使用方法是有所区别的在模型里边创建的钩子,你可以理解为执行一个函数,是无法调用模型里边的类的方法及属性的.比如系统文件\application\ ...

  9. 12款响应式 Lightbox(灯箱)效果插件

    灯箱效果(Lightbox)是网站中最常用的效果之一,用于实现类似模态对话框的效果.网络上各种 Lightbox 插件琳琅满目,随着响应式设计(Respnsive Design)的发展,这一先进理念也 ...

  10. CI 学习笔记、记录

    [ci框架]ci框架目录结构分析 分类: [CodeIgniter深入研究]2013-05-09 00:24 7420人阅读 评论(5) 收藏 举报 [php] view plaincopy mysh ...

随机推荐

  1. STM32应用实例十五:STM32的ADC通道间干扰的问题

    最近我们在开发一个项目时,用到了MCU自带的ADC,在调试过程中发现通道之间村在相互干扰的问题.以前其实也用过好几次,但要求都不高所以没有太关注,此次因为物理量的量程较大,所以看到了变化. 首先来说明 ...

  2. 整理oracle 树形查询

    注:本文参考了<整理oracle 树形查询> sql树形递归查询是数据库查询的一种特殊情形,也是组织结构.行政区划查询的一种最常用的的情形之一.下面对该种查询进行一些总结: create ...

  3. Confluence 6 注册单一小工具

    如果你不能订阅一个应用的小工具,你需要将小工具一个一个的添加进来.针对网站不支持小工具订阅和你的应用和你的 Confluence 不能建立信任连接的情况,你就只能这样添加了. 首先你需要获得小工具的 ...

  4. MobileNet V2

    https://zhuanlan.zhihu.com/p/33075914 http://blog.csdn.net/u011995719/article/details/79135818 https ...

  5. JavaScript利用键盘方向键(上下键)控制表格行选中

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. javaSocket笔记

    1.查看电脑当前开放链接的端口号 使用netstat命令 netstat -nao 可以查看PID进程号 netstat -nab 获取进程的详细信息 2.类创建的不同对象,引用是不同的.也就是说同一 ...

  7. bitset用法详解

    参见此博客: https://www.cnblogs.com/magisk/p/8809922.html

  8. RFC2119:RFC协议动词含义

    协议地址:http://www.ietf.org/rfc/rfc2119.txt MUST 必须的.通过它描述的对象,是强制要求的.它与REQUIRED和SHALL含义相同. MUST NOT 不允许 ...

  9. 滴水穿石-07Java开发中常见的错误

    1:使用工具Eclipse 1.1 "语法错误" 仅当源级别为 1.5 时已参数化的类型才可用 设置eclipse,窗口—>java—>编译器—>JDK一致性调到 ...

  10. Zabbix监控——Zabbix自定义用户参数制作监控项

    https://blog.51cto.com/183530300/2087774 https://www.cnblogs.com/richardzgt/articles/7889404.html