我自己开发了一个 MVC 架构的 CMS 系统(以前帖子提过,暂时只开发到 dev 版本,beta 还未发布),目前系统有个插件功能,我原本已有的一个设计思路是这样:
①系统入口-->根据路由检测 controller 及 action,优先调用插件 plugins 目录的 controller 和 action 如下:
url:http://xxxx/Index/index
↓↓访问插件目录( plugins )同名控制器 IndexController.php 里面的 index 方法
Home/plugins/IndexController.php
↓↓如果不存在同名控制器或者存在控制器,不存在对应方法 index,则访问系统控制器
Home/IndexController.php
上面这个是已有的插件设计思路,用户只需要制作同名控制器放入 plugins 文件夹即可,但是有个弊端是一个方法只能设计一个插件,因为不能存在多个同名文件共存的情况。所以,我打算重新增加一个插件设计,如下:
②系统入口-->根据路由检测系统模块 Home、controller 及 action,查询对应 hook 表内是否有注册这个控制器的插件(钩子),如下:
url:http://xxxx/Index/index
↓↓根据模块 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 了,要不改为读取文件的形式?实际运用不知道会出现什么状况?想问问大家有什么弊端?或者推荐一下你自己的设计思路,友善谈论。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.