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

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

前言

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

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

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

{:hooks('documentDetailAfter')}

这个的意思就是:相当于在这边 打一个点 ,我们可以将插件挂载到那
官方的说法是:文档末尾显示显示的 钩子
意思就是说,在文档末尾的时候,会自动调用挂载在那个 钩子 上的插件

立即学习“PHP免费学习笔记(深入)”;

举例说明

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

小鸽子助手 小鸽子助手

一款集成于WPS/Word的智能写作插件

小鸽子助手 26 查看详情 小鸽子助手

    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');        }    }

钩子的简单实现代码

目录结构:../hook/Hook.php

钩子核心类Hook.php:

    <?php        namespace hook;    class Hook{                static protected $hook = [];                /**         * 插件注册         * @param [type] $name   [description]         * @param [type] $addons [description]         */        static public function add($name,$addons){            self::$hook[$name] = $addons;        }        /**         * 插件执行         * @param  [type] $name [description]         * @return [type]       [description]         */        static public function run($name){            if(isset(self::$hook[$name])){                $method = (new self::$hook[$name]());                   call_user_func([$method,$name]);            }                    }    }

简单的插件demo:

    <?php    namespace addonsdemo;    class Demo{        public function registerBefore(){            echo 'registerBefore'.'
'; } public function registerAfter(){ echo 'registerAfter'.'
'; } }

插件实现的地方,即上文的注册的文件:

    <?php    namespace indexcontroller;    use hookHook;    class Index{        public function index(){            Hook::run('registerBefore');            echo '注册完成'.'
'; Hook::run('registerAfter'); } }

入口文件index.php

    index();

运行接口如下:

    registerBefore    注册完成    registerAfter

如果要添加新的功能,程序员只要修改demo的插件就可,如果要拓展新的功能,只需要拓展registerBefore和registerAfter即可。 

以上就是thinkphp插件钩子的实现机制是什么的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/310873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 05:18:34
下一篇 2025年11月5日 05:19:47

相关推荐

发表回复

登录后才能评论
关注微信