因为想在博客中实现一些有意思的功能,比如有人评论了向手机发送一个通知,而这些功能又不属于博客基础系统的流程,最好的方式是这些博客主业务以外的流程使用插件来实现,经过一段时间的构思后,现在已经实现了插件的机制。
插件机制的基础构思是基于钩子的实现,在系统中相关的位置放置钩子,然后插件注册自己想要挂载的钩子,系统执行到此处的时候会调用到插件的钩子,即可实现代码无侵入式的插件功能。
基础的钩子机制实现后,对插件的架构进行了简单的设计,插件就是一个带了一堆插件程序文件的目录,有一个注册入口文件 plugin.php 里面包含了插件的基础描述信息,如名称、简介、入口及钩子的配置等等。将这个目录丢到 /plugin/ 目录中,后台即可看到这个未启用的新插件,为了防止插件钩子机制对整体造成性能影响,在启用或停用的时候,把插件钩子的关系加入到启用钩子配置中,这个配置只是一些数组和字符串且有缓存,里面描述了各个挂载点里启用的插件钩子对应的可调用结构,在钩子未触发到的时候,不会额外加载任何插件相关的东西,也就尽最大可能避免了插件对主系统的性能影响。
插件配置界面
实现了以上功能后,考虑到插件可能会有一些个性化或者重要信息配置,在插件 plugin.php 中支持了自定义配置项,插件可以设定自己拥有的配置,后台可以对这些配置进行修改。使用自定义配置项的时候,插件需要有一个继承自 \app\libs\Plugin 的入口类,这个入口类会规范插件对自己的配置的读取,隔绝与系统及其它插件之间配置的影响,也可以让插件拥有自己的状态。
Bark 插件发送的通知
当然还有很多其它技术细节,比如考虑到类实例化的开销,简单的插件还可以使用静态钩子等等,静态勾子可以直接指向 PHP 类的静态方法或一个函数。
目前这些机制都已经实现,源码中包含了两个非常简单的插件示例。当然有一些细节还未实现,比如更多的钩子(需要时再加),更多的配置类型,如下拉框、单选、多选等等(需要时再加),当然这些都不是问题,当然比如有可能会需要前置钩子可以对业务实现拦截修改等等。
VGOT Blog 是一款基于 PHP + MySQL 实现的开源博客程序,希望能够成为一款面向大众的简洁易用、方便扩展的博客系统,扩展就从这个插件机制开始!
项目 Gitee 地址:https://gitee.com/pader/vgotblog
欢迎讨论、使用、一起参与开发。
评论 共有 0 条评论
暂无评论,快发表你的评论吧。