Thinkphp5框架简单实现钩子(Hook)行为的方法示例


Posted in PHP onSeptember 03, 2019

本文实例讲述了Thinkphp5框架简单实现钩子(Hook)行为的方法。分享给大家供大家参考,具体如下:

实现在一个方法开始和结束加入两个行为:api_init、api_end

框架的搭建和模块的建立这里就省略了,请不太熟练的同学自行学习。

下面直接进入步骤:

1,先创建一个行为类  \application\api\behavior\AopTest.php

<?php
namespace app\api\behavior;
//行为类
class AopTest{
  //绑定api初始化
  public function apiInit(&$params){
   //参数获取
   $id = input('id');//获取请求参数
   $uid = session('UID');//获取session 登录uid
   //打印输出
   echo PHP_EOL;
   echo 'ip检查'.$params.' GET:'.$id;
   echo ' uid='.$uid;
   echo PHP_EOL;
   //获取当前模块 控制器名 方法名称
   $request= \think\Request::instance();
   $controller_name = $request->controller();
   $model_name = $request->module();
   $action_name = $request->action();
   echo ' controller_name='.$controller_name.' model_name='.$model_name.' action_name='.$action_name;
   //构建数组
   $data = array();
   $data['status'] = 0;
   $data['msg'] = '没有权限';
   //exit(json_encode($data));//以json格式返回数据
  }
  //绑定api结束
  public function apiEnd(&$params){
   echo PHP_EOL;
   echo '日志记录'.$params;
   echo PHP_EOL;
  }
}

2,配置标签 \application\api\tags.php

这里要注意的是配置的key就是对应的行为类内的方法,如果行为类内只需要一个方法,默认用run方法,如果是多个方法则对应的标签的key,

注: V5.0.4+ 版本以上,行为类的方法需要采用驼峰法命名 apiInit,如果在版本以下可以用 api_init

// 应用行为扩展定义文件
return [
 //接口初始化
 'api_init'  => ['app\\api\\behavior\\AopTest'],
 'api_end'  => ['app\\api\\behavior\\AopTest'],
];

3,在要加入行为的类的方法内加入行为监听。

<?php
namespace app\api\controller;
use \think\Hook;
class Index
{
  //访问url http://app.tp5.com/index.php/api/index/index?id=5
 public function index()
 {
  session_start();
  session('UID',123);
  $id = input('id');
  $params1 = '参数1';
  $res = Hook::listen('api_init',$params1);
  echo var_export($res, true);
  echo 'api index';
  $params2 = '参数2';
  Hook::listen('api_end',$params2);
 }
}

4,访问查看输出效果:

Thinkphp5框架简单实现钩子(Hook)行为的方法示例

5,文件分布示意

Thinkphp5框架简单实现钩子(Hook)行为的方法示例

简单的实现了一下,希望给想了解的同学一点启发。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP设计聊天室步步通
Oct 09 PHP
简单的过滤字符串中的HTML标记
Dec 25 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
PHP目录操作实例总结
Sep 27 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 #PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 #PHP
Laravel使用Queue队列的技巧汇总
Sep 02 #PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 #PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 #PHP
PHP 文件上传限制问题
Sep 01 #PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 #PHP
You might like
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
iOS10推送通知开发教程
2016/09/19 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
Javascript缓存API
2016/06/14 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
用C语言实现文件读写操作
2013/10/27 面试题
请解释接口的显式实现有什么意义
2012/05/26 面试题
IBatis持久层技术
2016/07/18 面试题
中学教师岗位职责
2013/11/26 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
会计岗位职责
2015/02/03 职场文书
蜗居观后感
2015/06/11 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python