V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JarvisTang
V2EX  ›  程序员

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

  •  
  •   JarvisTang · 2020-07-13 21:00:40 +08:00 · 2427 次点击
    这是一个创建于 1592 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先谢谢各位了。

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

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

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

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

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

    再次感谢

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

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

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

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

    你只是没搞清楚思路。你可以先找一下 wordpress 的插件机制去深入了解,然后开发一个插件看看,搞清楚流程了就明白要怎么开发。
    BaiXiaoSheng
        6
    BaiXiaoSheng  
       2020-07-13 23:45:45 +08:00
    如果是做插件的话,而且又是需要热加载的话,Java 还是可以考虑的,缘由是 Java 是动态语言,我得考虑是编译型语言比较难做到不重新启动就能加载,如果不是热加载的话仅仅是实现插件机制,PHP 应该也是可以的。
    ljpCN
        7
    ljpCN  
       2020-07-14 00:00:22 +08:00 via Android
    @BaiXiaoSheng Java 是动态语言?
    anaf
        8
    anaf  
       2020-07-14 00:19:24 +08:00
    我把 WordPress 的 addons 的插件机制复制到了 TP 上。 就是复制几个类 不难的
    luckyrayyy
        9
    luckyrayyy  
       2020-07-14 08:14:35 +08:00
    Java 有个 OSGI,但是没详细了解过不知道是不是符合要求。
    imdong
        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 就在安装的时候执行一次就好了。
    nl101531
        11
    nl101531  
       2020-07-14 09:49:31 +08:00 via iPhone
    没太理解你的难点,我认为插件的难处在于动态加载以及释放这部分,解释性语言天然支持啊。编译类型才麻烦,比如 Java 可能就需要自定义类加载器,卸载还需要想办法 gc 释放掉。
    wildlife
        12
    wildlife  
       2020-07-14 10:06:35 +08:00
    web 应用的话,我觉得 PHP 等动态脚本语言是最容易实现插件机制的,zblogphp 应该是一个简单又典型的插件实践案例,可以参考一下
    no1xsyzy
        13
    no1xsyzy  
       2020-07-14 10:11:16 +08:00
    参考下 nextcloud ?
    所有插件放在一个文件夹下。
    wildlife
        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;
    }
    }
    ```
    BaiXiaoSheng
        15
    BaiXiaoSheng  
       2020-07-14 11:37:23 +08:00
    @ljpCN 虚拟机语言啊,可以运行时加载 class 文件或者 jar 包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1008 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:01 · PVG 04:01 · LAX 12:01 · JFK 15:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.