iWebShop插件开发手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
iWebShop插件开发手册
V4.4
2016-03-20
目录
概述 (3)
拦截器(钩子) (3)
插件核心类plugin.php (3)
插件内置钩子事件 (3)
插件注册接口reg (5)
事件触发接口trigger (5)
插件基类公开接口 (6)
插件存放目录 (7)
开发插件类文件 (7)
插件视图引入 (11)
概述
此文档仅适合对iWebShop整体架构和开发模式比较了解,并且有一定php技术经验的开发人员,此文档专业性比较强,不适合非技术类人员阅读。
iWebShop从V4.4版本开始全面支持插件机制,插件是什么东西?总体来说,插件是一种可以热插拔的(动态安装和卸载),可以实现一定功能性并且对目前现有运行系统不会产生任何影响的一种松散耦合的设计模式,它内容丰富,而且易扩展,可以有更多的开发者参与进来,让产品自身的功能更加丰富多彩,它也可以通过动态的安装组合,实现不同的产品架构。
拦截器(钩子)
说到插件就不得不提到钩子,插件之所以能够动态的加载到系统运行的各个环节中,主要是依赖于钩子,什么是钩子呢?钩子就是iWebShop系统在运行中预留的一些事件函数,我们把插件注册(挂接)到iWebShop的某个事件上面,当iWebShop运行到这个事件的时候就会自动触发并且调用插件,只有明白了这个原理,我们才能继续下面的开发,关于更多钩子机制,可以百度学习一下。
iWebShop为开发者预留的大量的钩子,同时也支持开发者自己定义钩子事件,下面介绍一下系统都预留了哪些钩子可以让开发者使用。这些钩子的调用和触发都在插件的核心管理类中,下面会重点介绍!
插件核心类plugin.php
classes/plugin.php是插件的核心类,所有插件的注册,调用,配置等等都必须要依靠它!
插件内置钩子事件
在核心插件类里面有系统内置的所有钩子,如图:
整个系统会在各自的地方调用预留的钩子,这些钩子就是让插件工作起来的源动力!
iWebShop 在运行过程中,会自动触发plugin 核心类的注册事件,以达到调用各个插件的目的。以上流程图就是iWebShop 整个运行所触发的事件,我们的插件就要注册(挂接)到这些事件上,插件里面的代码可以在绑定的事件下运行,而且还可以给任意的控制器(controller )里面扩展动作(action )。让插件里面的代码也可以和系统原有的控制器动作一样运行。
事件触发是广泛的,比如onCreateController 这是事件会监听所有控制器的创建,但是有的时候,我们的插件仅仅是针对某个控制器的,比如前台访问统计,或者是后台的订单自动取消等,这些功能仅需要监听(注册)site.php 和order.php 控制器,于是我们可以把事件名称做一下变形,比如:onCreateController@site onCreateController@order 这样就可以为某个控制器绑定事件了!如果我们要在simple 控制器下面扩展一个AAA 的动作方法,那么我们就要在
onBeforeCreateAction@simple@AAA 绑定这个事件,这个事件的解释:在创建simple 控制器下的AAA 动作之前调用,就是在程序要调用simple 下的AAA 的时候,我们动态的给当前控制器(simple )增加方法。plugin::reg(“onBeforeCreateAction@simple@AAA”,function(){
self::controller()->AAA =function(){echo “hello AAA”;}
});
同理动作(action )也是如此,那么我们只需要继续追加@动作ID 比如,我们要在首页(site/index )动作中做处理,那么监听的事件名字:onCreateAction@site@index 按照层级关系追加就可以了,控制器(controller )包含动作(action )。
下面我们介绍最常用的事件:
【onBeforeCreateAction 】重点!!
动作(action )创建之前,此时控制器已经创建了,动作(action )还没有创建,利用此方法可以动态扩展控制器下的动作,让插件的代码可以整合到控制器里面被程序调用。
事件名称后面直接追加@控制器ID@动作ID 可以在特定的动作调用之前进行扩展,比如有个插件需要在site 控制器下,增加个PPP 动作方法,用来输出“iWebShop4.4”这个字符串,那么我们就需要在插件的reg 接口里面编写:
plugin::reg(“onBeforeCreateAction@site@PPP”,function(){
self::controller()->PPP =function(){echo “iWebShop4.4”;}
});
当然也可以绑定到一个插件类方法上self::controller()-PPP=$this->aaa();
通过以上方式,把原本不存在的PPP 方法,动态添加到了site 控制器里面,而且对其他程序无任何影响!只有在程序要调用site/PPP 的时候才会运行!是不是很酷 【onCreateController 】
控制器(controller )创建完成,可以得到当前正在运行的控制器,此时动作(action )还没有创onCreateAp onCreateController onCreateAction
onFinishAction onFinishController onCreateView
onFinishView
onFinishApp onBeforeCreateController onBeforeCreateAction