先谢谢各位了。
情况是这样的,我想要开发一个通用型产品的后端(不从零开始,所以基于开源框架开发),实现类似 WordPress 插件机制的功能,让第三方开发者可以在不修改主程序的情况下,扩展更多功能。后端平台的插件机制,可以有自己的页面和 API 接口(面向客户端)。
因为我熟悉 PHP 语言,所以研究了 PHP 的各个框架,比如 Laravel 框架。
但是由于现在的 PHP 编程框架都是依赖 Composer 安装的,不好注入加载项,所以实现插件机制,逻辑有点走不通。
想向社区里各位请教一下,PHP 的框架能不能行得通?
或者其他语言是否有适合的 Web 框架(方便做插件机制)。
再次感谢
1
LongMaoz 2020-07-13 21:04:21 +08:00 via Android
路由加载?
|
2
qiayue 2020-07-13 21:20:27 +08:00
fastadmin ?
|
3
JarvisTang OP @qiayue 有点意思,就这个思路,但是我面向的不是开发者,是使用者。
使用者安装我的产品之后,可以在后台应用中心(插件市场)选择插件安装(免费或收费),然后安装后就能配置使用了。使用者可能是不懂技术的人,所以面向的不是开发者。 |
4
JarvisTang OP @qiayue 所以插件面向的不是开发者,使用者安装即用,不用开发。就像 WordPress 插件。
|
5
HiCode 2020-07-13 21:45:08 +08:00
插件机制的本质是什么?
系统制定插件加载、执行规则,提供钩子列表; 插件按系统指定规则开发代码,拦截钩子。 PHP 、Node 、Python 等等都能满足你的需求,哪怕 C++也可以通过 dll 载入实现插件机制,实现应用安装功能。 你只是没搞清楚思路。你可以先找一下 wordpress 的插件机制去深入了解,然后开发一个插件看看,搞清楚流程了就明白要怎么开发。 |
6
BaiXiaoSheng 2020-07-13 23:45:45 +08:00
如果是做插件的话,而且又是需要热加载的话,Java 还是可以考虑的,缘由是 Java 是动态语言,我得考虑是编译型语言比较难做到不重新启动就能加载,如果不是热加载的话仅仅是实现插件机制,PHP 应该也是可以的。
|
7
ljpCN 2020-07-14 00:00:22 +08:00 via Android
@BaiXiaoSheng Java 是动态语言?
|
8
anaf 2020-07-14 00:19:24 +08:00
我把 WordPress 的 addons 的插件机制复制到了 TP 上。 就是复制几个类 不难的
|
9
luckyrayyy 2020-07-14 08:14:35 +08:00
Java 有个 OSGI,但是没详细了解过不知道是不是符合要求。
|
10
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 就在安装的时候执行一次就好了。 |
11
nl101531 2020-07-14 09:49:31 +08:00 via iPhone
没太理解你的难点,我认为插件的难处在于动态加载以及释放这部分,解释性语言天然支持啊。编译类型才麻烦,比如 Java 可能就需要自定义类加载器,卸载还需要想办法 gc 释放掉。
|
12
wildlife 2020-07-14 10:06:35 +08:00
web 应用的话,我觉得 PHP 等动态脚本语言是最容易实现插件机制的,zblogphp 应该是一个简单又典型的插件实践案例,可以参考一下
|
13
no1xsyzy 2020-07-14 10:11:16 +08:00
参考下 nextcloud ?
所有插件放在一个文件夹下。 |
14
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; } } ``` |
15
BaiXiaoSheng 2020-07-14 11:37:23 +08:00
@ljpCN 虚拟机语言啊,可以运行时加载 class 文件或者 jar 包
|