php插件化开发,有个PHP插件设计思路想跟⼤家探讨下是否可
⾏?
我⾃⼰开发了⼀个 MVC 架构的 CMS 系统(以前帖⼦提过,暂时只开发到 dev 版本,beta 还未发布),⽬前系统有个插件功能,我原本已有的⼀个设计思路是这样:
①系统⼊⼝-->根据路由检测 controller 及 action,优先调⽤插件 plugins ⽬录的 controller 和 action 如下:
↓↓访问插件⽬录( plugins )同名控制器 IndexController.php ⾥⾯的 index ⽅法
php文件管理系统mvc 源码Home/plugins/IndexController.php
↓↓如果不存在同名控制器或者存在控制器,不存在对应⽅法 index,则访问系统控制器
Home/IndexController.php
上⾯这个是已有的插件设计思路,⽤户只需要制作同名控制器放⼊ plugins ⽂件夹即可,但是有个弊端是⼀个⽅法只能设计⼀个插件,因为不能存在多个同名⽂件共存的情况。所以,我打算重新增加⼀个插件设计,如下:
②系统⼊⼝-->根据路由检测系统模块 Home、controller 及 action,查询对应 hook 表内是否有注册这个控制器的插件(钩⼦),如下:
↓↓根据模块 Home、控制器 Index、⽅法 index 查询表 hook 是否有注册对应的钩⼦,如果有,则预选执⾏钩⼦,如:
TestController.php ⾥⾯的 index ⽅法绑定了这个⽅法,存在多个则根据排序 orders,依次执⾏。
Home/plugins/TestController.php Class(Test)->index()
如果存在多个注册:
( Home/plugins/Test1Controller.php Class(Test1)->index1())
( Home/plugins/Test2Controller.php Class(Test2)->index2())
↓↓执⾏完 hook 表⾥注册的钩⼦,再执⾏真正的控制器,当然,有可能钩⼦⾥⾯就直接 exit 了,不再执⾏下去。
Home/IndexController.php Class(Index)->index()
如上,两种设计思路,可能都是我⾃创的,我希望是所有控制器都能够⾃由定义,不拘于个别放置埋点的地⽅才可以设计插件。第⼀种设计,在不改动系统⽂件情况下,完美融⼊系统,弊端前⾯也说了,⼀个类⾥⾯的同个⽅法不能接⼊多个插件。第⼆种是我今天刚设计出来的,在安装插件的时候,需要在 hook 表⾥⾯新增注册的插件,⼀个⽅法可以不限制注册插件个数,执⾏顺序也可以⾃由定义,我感觉每次查询数据库这个会导致很⼤的问题,如果 100W 访问,估计数据库直接 GG 了,要不改为读取⽂件的形式?实际运⽤不知道会出现什么状况?想问问⼤家有什么弊端?或者推荐⼀下你⾃⼰的设计思路,友善谈论。