想要开发一个带插件机制的后端,请问现在哪种编程框架适合呢?

2020-07-13 21:00:40 +08:00
 JarvisTang

先谢谢各位了。

情况是这样的,我想要开发一个通用型产品的后端(不从零开始,所以基于开源框架开发),实现类似 WordPress 插件机制的功能,让第三方开发者可以在不修改主程序的情况下,扩展更多功能。后端平台的插件机制,可以有自己的页面和 API 接口(面向客户端)。

因为我熟悉 PHP 语言,所以研究了 PHP 的各个框架,比如 Laravel 框架。

但是由于现在的 PHP 编程框架都是依赖 Composer 安装的,不好注入加载项,所以实现插件机制,逻辑有点走不通。

想向社区里各位请教一下,PHP 的框架能不能行得通?

或者其他语言是否有适合的 Web 框架(方便做插件机制)。

再次感谢

2458 次点击
所在节点    程序员
15 条回复
LongMaoz
2020-07-13 21:04:21 +08:00
路由加载?
qiayue
2020-07-13 21:20:27 +08:00
fastadmin ?
JarvisTang
2020-07-13 21:37:06 +08:00
@qiayue 有点意思,就这个思路,但是我面向的不是开发者,是使用者。
使用者安装我的产品之后,可以在后台应用中心(插件市场)选择插件安装(免费或收费),然后安装后就能配置使用了。使用者可能是不懂技术的人,所以面向的不是开发者。
JarvisTang
2020-07-13 21:37:41 +08:00
@qiayue 所以插件面向的不是开发者,使用者安装即用,不用开发。就像 WordPress 插件。
HiCode
2020-07-13 21:45:08 +08:00
插件机制的本质是什么?

系统制定插件加载、执行规则,提供钩子列表;

插件按系统指定规则开发代码,拦截钩子。

PHP 、Node 、Python 等等都能满足你的需求,哪怕 C++也可以通过 dll 载入实现插件机制,实现应用安装功能。

你只是没搞清楚思路。你可以先找一下 wordpress 的插件机制去深入了解,然后开发一个插件看看,搞清楚流程了就明白要怎么开发。
BaiXiaoSheng
2020-07-13 23:45:45 +08:00
如果是做插件的话,而且又是需要热加载的话,Java 还是可以考虑的,缘由是 Java 是动态语言,我得考虑是编译型语言比较难做到不重新启动就能加载,如果不是热加载的话仅仅是实现插件机制,PHP 应该也是可以的。
ljpCN
2020-07-14 00:00:22 +08:00
@BaiXiaoSheng Java 是动态语言?
anaf
2020-07-14 00:19:24 +08:00
我把 WordPress 的 addons 的插件机制复制到了 TP 上。 就是复制几个类 不难的
luckyrayyy
2020-07-14 08:14:35 +08:00
Java 有个 OSGI,但是没详细了解过不知道是不是符合要求。
imdong
2020-07-14 09:27:13 +08:00
本菜菜对插件机制的一些理解,不知道对不对,希望没给楼主指错路,也希望大家知道批评:

PHP 面向 Composer 开发不影响自己实现插件机制,我们可以再额外注册一个 autoload 到 __autoload() 队列中。

https://www.php.net/manual/zh/function.spl-autoload-register.php

假设我们使用了像 Laravel 这样的框架开发程序系统,在插件安装后由于不能更改原有程序代码,所以要用到的是“回调”这样的实现。

当 某某事件 发生时,调用插件的 某某方法,传递必要的(统一的)参数。

然后我们只需要规范好插件安装在什么地方,我如何加载你,我有那些事件,触发时会给你什么。

比如我会规范:插件统一在 /Ext/ 目录(命名空间)下,以自身插件名为二级命名空间。

大致规范就是 Ext/{开发者}/{插件名};

然后我会公开一个事件列表,事件源::事件名(可以提供的参数)

Page::onLoadPre($page_type = 'index', $data)
AdminPanel::addMenu($position = 'post', $menu)


然后插件安装的时候,注册一次自己的所有事件到对应的回调。

当你的代码执行到某个地方的时候,触发钩子,遍历已经注册的回调。

或者某些只需要执行一次,比如刚才的 AddMenu 就在安装的时候执行一次就好了。
nl101531
2020-07-14 09:49:31 +08:00
没太理解你的难点,我认为插件的难处在于动态加载以及释放这部分,解释性语言天然支持啊。编译类型才麻烦,比如 Java 可能就需要自定义类加载器,卸载还需要想办法 gc 释放掉。
wildlife
2020-07-14 10:06:35 +08:00
web 应用的话,我觉得 PHP 等动态脚本语言是最容易实现插件机制的,zblogphp 应该是一个简单又典型的插件实践案例,可以参考一下
no1xsyzy
2020-07-14 10:11:16 +08:00
参考下 nextcloud ?
所有插件放在一个文件夹下。
wildlife
2020-07-14 10:14:49 +08:00
```php
foreach ($GLOBALS['hooks']['Filter_Plugin_ViewIndex_Begin'] as $fpname => &$fpsignal) {
$fpreturn = $fpname($url);
if ($fpsignal == PLUGIN_EXITSIGNAL_RETURN) {
$fpsignal = PLUGIN_EXITSIGNAL_NONE;

return $fpreturn;
}
}
```
BaiXiaoSheng
2020-07-14 11:37:23 +08:00
@ljpCN 虚拟机语言啊,可以运行时加载 class 文件或者 jar 包

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689706

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX