如何利用PHP插件机制,快速拓展你的系统
在传统的开发中,一个系统的所有功能都是揉在一起的,相互牵连,不可分割,要用就必须一起用,要关闭也必须一起关闭。对于一些核心的必须的功能,这种操作可能还没有太大关系,但对于一些实验性的功能,这种模式就有点不够灵活了。
那有没有一种方案,可以实现某一功能的快速开启及快速关闭,即我想使用就在后台操作某一按钮安装起来,不想使用就操作另一按钮卸载掉,并且该功能的安装卸载不会影响其他核心功能呢?答案:使用插件机制。
什么是插件
插件,顾名思义就是可插拔的物件。在PHP中,插件也是用于扩展系统功能的一些独立的可安装可卸载的“组件”。
PHP插件的特点
PHP插件的定位是用于实现某些简单的显示及数据处理的功能扩展,如文章评论。插件的开启关闭,不会影响原有系统。
PHP插件的几个要素
根据插件的定位,一个完整的PHP插件一般包含以下几个要素:
- 钩子
- 插件主体
- 配置后台
1、钩子
钩子就是系统中的一些标签位,用来挂载插件或其他程序。当程序执行到某一钩子时,钩子就会执行挂载到其上的插件或程序。
2、插件主体
这是插件的核心内容,包括插件的入口文件,控制器、模型、视图等。
3、配置后台
这是管理插件的地方,一个插件的安装、卸载,开启、关闭,及其他基本信息的设置都是由这里控制。
PHP插件的开发流程
根据上面介绍的PHP插件的几个要素,PHP插件的开发大致可以分为创建钩子—〉挂载插件—〉开发插件—〉安装卸载几个步骤。
下面以onethink的插件系统为例来介绍PHP插件的开发流程:
1、创建钩子
PHP插件的使用是通过钩子来完成的,所谓钩子其实就是一个标签位,需要提前埋在程序中。当程序运行到此标签位时,程序就会检测当前标签位是否有挂载插件,如果有则执行插件操作。
设置钩子标签位:documentDetailAfter

2、挂载插件

3、创建插件
创建插件主要是创建插件的入口文件

插件入口文件主要包含info属性,install方法,unstall方法和钩子方法。其中,info属性定义了插件的基本信息,如插件的名字、标题、描述、作者等;install方法用来判断是否可以安装插件,直接返回布尔值;unstall方法用来判断是否可以卸载插件,也是直接返回布尔值;而钩子方法则直接执行插件的功能,是插件的核心部分。
4、安装、卸载插件
安装、卸载插件主要是进行一些静态文件位置的迁移,数据表的创建及删除。另外,这涉及到几个基础的数据表,钩子表、插件表和钩子插件对应表,如下:

安装卸载插件实际就是在这几张表中添加记录和删除记录,如下是onethink中插件安装和卸载的操作:

安装插件
从图中我们可以看到,所谓安装,卸载的确是通过在数据库中添加记录和删除记录实现的。

卸载插件
不过,对于那些需要使用数据库的插件而言,有一点不同,那就是这些插件需要定义数据表创建的SQL和数据表删除的SQL,如图中install.sql和unstall.sql
当我们完成插件的安装之后,我们就可以使用插件了。
下面附上onethink中关于插件开发的效果图




相关推荐
-
PHP8种变量类型的详细讲解2025-02-22 00:32:24
-
php+apache 和 php+nginx的区别2025-02-22 00:21:27
-
PHP:与workerman结合实现定时任务2025-02-22 00:15:57
-
Nginx的Rewrite规则与实例2025-02-22 00:15:39
-
MySql中身份证字段的简单脱敏介绍2025-02-22 00:15:36