thinkphp插件钩子的实现机制是什么

    现在主流的cms或者blog等系统中,都内置的有插件系统,但是层层深入、剖析实现的方式,其实都是最简单的钩子的复杂化的实现。

    前言

    插件的执行通过钩子来触发;可以把插件看作挂在钩子上的东西;插件只有在成功实现相应钩子方法并被正确安装启用后才能执行。

    开发者也可以用hook('test')方法在控制器只加入钩子,让你的应用具有更好的扩展性;同时也可以模板里加入钩子{:hook('footer')};钩子也支持传入参数hook('footer',array('test'=>1));

    向系统暴露你的钩子,就是把你的钩子在相应的文件里列出来,系统会来检测。

    {:hooks('documentDetailAfter')}登录后复制

    举例说明

    php中所谓的钩子,其实就是一种事件驱动,主要分为‘注册事件’、‘触发事件’两步。所谓‘注册事件’,即目的是给未来可能发生的'事情'起一个名字,名字,可以用单例模式或者注册 为一个全局的变量,用的时候直接在对应的方法或者类再或者函数中插入这个变量即可;‘触发事件’,本质上就是在事件的全局变量中查询要触发的时间名称,然后找到注册号的类与方法,实例化运行。举个例子来说明一下。项目经理给我们了如下的需求:第一天:开发注册的功能。程序员巴拉巴拉,三下五除二就完成了。第二天:在注册前添加发送短信验证码的功能。程序员巴拉巴拉,三峡五除二就又完成了。第三天:注册完成之后,给用户添加相应的积分。程序员又开始巴拉巴拉ing……

    class Register{ public function index(){ /** * 第二天发送短信功能 */ /** * 第一天注册代码 */ /** * 第三天增加积分功能 */ } }登录后复制

    作为优秀程序员的我们,当然不容许我们程序中代码冗余、混乱的出现,于是我们把方法写成函数独立出来,方便调用与代码简介。于是形成如下代码:

    class Register{ public function index(){ /** * 第二天发送短信功能 */ sendMsg($data); /** * 第一天注册代码 */ /** * 第三天增加积分功能 */ sendIntegral($data); } } /** * 发送短信 * @param {[type]} $data [description] * @return {[type]} [description] */ function sendMsg($data){ /* balabala */ } /** * 赠送积分 * @param {[type]} $data [description] * @return {[type]} [description] */ function sendIntegral($data){ /* balabala */ }登录后复制

    class Register{ public function index(){ //注册前钩子 Hook::run('registerBefore'); /** * 注册代码 */ //注册后钩子 Hook::run('registerAfter'); } }登录后复制