php钩子程序设计

<?php
/**
* @name Service_Page_Test
* @desc page层对接第三方抽象类
* @author
*/
abstract class Service_Page_Test
{
public $hookGroupPrev = null; // 前钩子组
public $hookGroupAfter = null; // 后钩子组
public $hookReturn = array(); //钩子返回值
public $reqData = null; // page模块分析的数据 /**
* 获取需要验证的参数配置
* @return array
*/
public function _getCheckParams()
{
return array();
} /**
* 入口方法
* @param array $arrInput
* @return array
*/
public function execute($arrInput)
{
$res = array(
'errno' => Test_Errno::ERRNO_SUCCESS,
'errmsg' => Test_Errno::$ERRMSG[Test_Errno::ERRNO_SUCCESS],
);
try {
$this->_init($arrInput);
$this->_beforeExecute();
$res = $this->doExecute($arrInput);
$this->_afterExecute();
} catch (Test_Exception $e) {
$res = array(
'errno' => $e->getCode(),
'errmsg' => $e->getMessage(),
);
} catch (Exception $e) {
$res = array(
'errno' => $e->getCode(),
'errmsg' => $e->getMessage(),
); }
return $res;
} /**
* auto exec
* @param array $arrInput
* @throws Exception
* @return array
*/
protected function doExecute($arrInput){
} /**
* 获取权限信息
* @param array $arrInput
* @return array
*/
public function _init($arrInput)
{
$pageModulesConf = Conf::getConf('page/' . get_class($this));
$this->reqData = $arrInput;
$this->hookGroupPrev[] = $pageModulesConf['hook_group']['prev'];
$this->hookGroupAfter[] = $pageModulesConf['hook_group']['after'];
} /**
* 执行filter
* @param string
*/
public function _beforeExecute()
{
if (!empty($this->hookGroupPrev) && is_array($this->hookGroupPrev)) {
foreach ($this->hookGroupPrev as $hookGroups) {
foreach ($hookGroups as $hookGroup) {
$this->_executeHook($hookGroup, $this->reqData);
}
}
}
} /**
* @param array $arrInput
* @return array
*/
public function _afterExecute()
{
if (!empty($this->hookGroupAfter) && is_array($this->hookGroupAfter)) {
foreach ($this->hookGroupAfter as $hookGroups) {
foreach ($hookGroups as $hookGroup) {
$this->_executeHook($hookGroup, $this->reqData);
}
}
}
} /**
* 执行filter
* @param string
*/
public function _executeHook($hookGroup, $reqData)
{ $hookGroupConf = Conf::getConf('hook/group/' . $hookGroup);
if(!empty($hookGroupConf)){
foreach($hookGroupConf as $hook){
$hookConf = Conf::getConf('hook/hook/' . $hook);
$class = $hookConf['class'];
$method = $hookConf['method'];
$inputParams = isset($hookConf['getInputParams']) ? $this->{$hookConf['getInputParams']}() : null;
if (class_exists($class)) {
$obj = new $class();
if (method_exists($obj, $method)) {
$this->hookReturn[$hook][] = $obj->$method($inputParams, $reqData);
}
}
}
} } }
hook.conf
# 钩子组
[group]
[.check_req_customer]
: checkReqCustomerBaseInfo
[.after_demo]
: afterDemo # 钩子
[hook]
[.checkReqCustomerBaseInfo]
class: Service_Page_Hook_Customer
method: checkBaseInfo
getInputParams: _getCheckParams [.afterDemo]
class: Service_Page_Hook_Customer
method: afterDemo
getInputParams: _getCheckParams
[Service_Page_Input]
#绑定钩子组
[.hook_group]
[..prev]
0 : check_req_customer
[..after]
0 : after_demo

php钩子程序设计的更多相关文章
- c++程序设计之编程思想
代码块愈小,代码的功能就愈容易管理,代码的处理和移动就愈轻松. 任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员. 绝大多数情况下,函数应该放在它所使用的数据的所 ...
- Java动态程序设计:反射介绍
使用运行的类的信息使你的程序设计更加灵活 反射授予了你的代码访问装载进JVM内的Java类的内部信息的权限,并且允许你编写在程序执行期间与所选择的类的一同工作的代码,而不是在源代码中.这种机制使得反射 ...
- 使用PreTranslateMessage替代钩子函数处理键盘消息
2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...
- Windows环境下32位汇编语言程序设计(典藏版)
Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...
- 利用钩子函数来捕捉键盘响应的windows应用程序
一:引言: 你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 【windows核心编程】系统消息与自定义钩子(Hook)使用
一.HOOk Hook是程序设计中最为灵活多变的技巧之一,在windows下,Hook有两种含义: 1.系统提供的消息Hook机制 2.自定义的Hook编程技巧 其中,由系统提供的消息钩子机制是由一系 ...
- VC++开发Windows系统全局钩子
本文的大部分内容属于对一篇网文的实践与练习,同时参考的还有一本书,在此向网文与书的作者表示敬意. 这个程序是一个windows系统键盘监控程序,随着开机自动启动,可以监控系统中各用户的键盘,并将按键记 ...
- Windows环境下32位汇编语言程序设计(典藏版)
<Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...
随机推荐
- jQuery EasyUI API - Base - Draggable [原创汉化官方API]
最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...
- ser2net使用
在ubuntu下或者openwrt下安装了ser2net程序之后,可以将串口中的数据转发为以太网数据. 设置在/etc/ser2net.conf中最后: 3002:0:/dv/ttyUSB0:1152 ...
- (UML两个汇总)九种图。
最后总结UML关系,有明确的关系,现在让我们总结一下UML九图..图往往比文字要直观,因此,当我们开发软件.文件必须是不可或缺的人物,. 以下我将这九种图分了一下: 我们还能够将这九种图分为静态图和动 ...
- Mysql高级之触发器
原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...
- android gps开发必备资料(含测试demo下载)
入门资料参考: How accurate is Android GPS? Part 1: Understanding Location Data How accurate is Android GPS ...
- Visual Studio 2014
开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1) 2014-06-06 18:04 by 梁逸晨, 2149 阅读, 29 评论, 收藏, 编辑 新特性 ...
- JavaScript闭包小窥
众所周知,JavaScript没有块级作用域,只有函数作用域.那就意味着定义在函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见.这带来的好处是内部 ...
- C#动态表达式计算(续1)
距上一帖近五天时间,让大家久等了,没想到关注这个话题的也不少人,正如有同志所说的想解决该问题其实是有太多的解决方法,比如动态构造类编译.调用vbscript或者可以采用javascript解析引擎或者 ...
- Attribute Routing
Attribute Routing 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 题外话:由于这个技术点是新学的,并不属于原系列,但借助了原系列 ...
- 2013集训.DAY1.A
发现自己漏整理了一套,现在附上T1:primenumT2:sendroseT4:warfare除了第一题以外,其余的两题由于当时太弱什么都不会,所以用来学习....T2 SPFA T4 最大生成树