创建"引擎"以允许集成到主Web应用程序?

Kar*_*rem 13 php architecture model-view-controller kohana

背景:

我目前有一个基于MVC Kohana PHP框架的Web应用程序,允许用户向他们的客户销售电子书.

webapp背后的代码全部连接在一起,除了以API为中心之外的一切.它运行纯MVC,然后使用胡子模板系统.

我想做什么:

我想整合各种会计服务(来自更大的北欧提供商,如e-conomic.com),但也有自己的集成,可以让用户优化他们的销售等等.

我想要的是制作一些东西,称之为引擎,允许功能集成(灵活地)到Web应用程序的各个部分,无论是在视图部分还是控制器/逻辑中.

基于背景并从技术角度看,有哪些方法可以做到这一点?

我的想法是,我需要在Web应用程序的不同区域中使用某种占位符.然后我需要这些占位符与"引擎"一起工作,然后检查集成是否想在这些区域"运行"?

那甚至会起作用吗?你会怎么做?


更新尝试使其更清晰:

所以我想要实现的是具有可以集成到现有主Web应用程序中的单独功能.

我只想说我有一个名为integrations /的文件夹,在这里有两个不同的集成,它们会影响系统的不同部分.

第一个是Kashflow(会计软件)集成,它从我们的系统中获取一些数据并发送到Kashflow(API方式,罚款),但也在我的webapp下"订单"状态下是否已经同步到Kashflow.(这是问题的一部分)

另一种集成可能是"特色电子书"集成.这只是让您选择应该展示的产品,然后在电子书商店中,特色产品将以其周围的橙色边框和一些较大的文本突出显示.(这是问题的一部分)

粗体标记如何工作​​?像Shopify这样的网上商店提供商有这样做的应用程序,所有其他带有应用程序的SaaS都有这个技术解决方案.

我不知道是吗?如何允许单独的功能影响基本webapp?

我希望现在能更清楚了.


新更新:

我寻找答案的答案是基于上述背景的答案,我如何能够实现一个解决方案,从我现在的位置开始.

一个好的答案是,也可以用text/pseudo方式描述如何实现我提到的示例插件/集成之一.

那么集成如何与主应用程序通信,主应用程序为了接受/允许功能有什么作用.

Pla*_*rov 2

根据您的更新,我认为您描述了需要模块化的 Web 应用程序的一个很好的案例。您希望能够轻松添加新模块(插件)来提供不同的功能,而不必每次都更改应用程序核心。

\n\n

以下是从概念角度来看您面临的挑战的可能解决方案。我的目的是帮助您掌握这个想法并开始使用。请记住,它可以进一步简化或变得更加复杂,具体取决于您的需求。

\n\n
\n\n

事物的理论方面

\n\n
    \n
  1. 插件/模块
  2. \n
\n\n

每个插件将启用一组特定功能,并且必须能够独立于当前启用的其他插件工作。所有插件都必须遵循一组通用的规则和约定才能被您的应用程序识别。这将极大地简化未来的维护和扩展。例如,每个插件应该:

\n\n
    \n
  • 在 Plugins/Modules 文件夹下有自己的子目录,遵循预定义的结构(例如 Backend/Portlets/InstallScripts 等)

  • \n
  • 在数据库中使用单独的存储沙箱,仅专用于此插件。以 Kashflow \xe2\x80\x93 为例,插件使用的所有表都可以以 ksflw_ 前缀开头。

  • \n
  • 带来自己的部分前端视图演示(以及底层控制器逻辑和模型),以实现特定的功能集(例如,在橙色边框中显示预先选择的书籍)

  • \n
  • 带来自己的部分后端视图演示(以及底层控制器和模型),在站点后端处理(在 Kashflow 的情况下,您有 portlet 可视化,它可能会呈现一个按钮来手动进行同步,使您能够安排一个和显示上次同步的日期时间)

  • \n
  • 有一个安装程序脚本,用于创建表、插入菜单项并初始化挂钩订阅(请参阅下一个项目符号)

  • \n
  • 初始化 Hooks 订阅\xe2\x80\x93 每当系统中某处发生注册事件时,所有订阅的插件函数都会被调用。

  • \n
\n\n
\n\n
    \n
  1. 核心功能变化
  2. \n
\n\n

您将需要在现有应用程序中添加新功能才能开始支持插件。

\n\n
    \n
  • 插件管理器\xe2\x80\x93 GUI,允许您安装、删除、启用/禁用插件并允许您的客户端访问它们。

  • \n
  • 部分视图管理器\xe2\x80\x93 允许用户选择哪些插件的部分视图显示在现有占位符中(这将与钩子结合使用)

  • \n
  • 页面上部分视图的占位符,位于您希望用户能够显示插件 UI 和信息的位置

  • \n
  • 整个应用程序中的挂钩\xe2\x80\x93 每当“有趣”事件发生时,系统会检查当前是否有任何插件订阅了该事件并调用/通知它们,然后显示结果。一些值得 Hook 的事件示例可能是:

    \n\n
      \n
    • 占位符渲染\xe2\x80\x93 这将触发所有订阅的功能以显示前端/后端部分视图

    • \n
    • 特定业务事件\xe2\x80\x93 例如每当新书被添加到目录或正在出售时

    • \n
    • 管理菜单呈现\xe2\x80\x93 在此事件中,每个已安装的插件将选择 PLUGINNAME_AdminPluginMenu 表中的所有菜单项(插件应在安装时创建此表)并将所有菜单项返回到挂钩以进行显示。

    • \n
  • \n
\n\n

我相信您会想到其他相关事件,因为您最了解自己的情况。

\n\n
\n\n

事情的实际方面(基于问题的第二次更新)

\n\n

1. 利用 HMVC 对现有视图内的部分视图(小部件)进行可视化

\n\n

正如我之前所说,Kohana 支持 HMVC 或分层模型视图控制器模式。这意味着您可以拥有像这样的控制器层次结构(已在以下问题中描述):

\n\n

MVC 与 HMVC

\n\n

现在,这使您可以轻松地从其他控制器甚至直接从您的视图调用控制器!当您需要嵌入小部件时,它会产生奇迹。

\n\n

您可以对 boostrap.ini 进行轻微修改,以启用类似的路由widget_controller/controller_action/action_parameter(这在我下面给您的教程中有详细描述)。然后,您可以在主视图模板中添加以下代码,以在其中渲染橙皮书框:

\n\n
<div class="widget_sidebar">\n     <?php echo Request::factory(\'widget_orangebook/display/3\')->execute(); ?>\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n\n

执行时,它充当一个钩子,并将使用参数 3 调用 widget_orangebook 控制器的 action_display 方法 - 例如,您想要显示 3 本书。

\n\n

控制器的操作将如下所示:

\n\n
public function action_display ($number_of_books){...}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此<div>,在执行操作后,您将在 中看到 widget_orangebook 控制器设置的模板内容。

\n\n

从某种意义上说,它给人一种 AJAX 部分渲染的错觉,但它是在服务器上执行的,无需额外的调用。它非常强大,我认为这就是您所描述的案例的方法。

\n\n

您可以参阅本教程以查看有关您需要执行的所有修改的详细说明。它有点奇特 - 它是关于在小部件部分中渲染多个小部件,但它遵循相同的逻辑。

\n\n

请注意,如果您坚持使用 Mustache 和无逻辑模板,您也可以在控制器中执行此类 Request 调用,将结果设置为变量,然后将该变量传递给您的 Mustache 模板。

\n\n

2. Kohana 模块

\n\n

Kohana 支持模块,允许您以有组织的方式打包插件。当您实现更复杂的插件时,这将变得很重要。您可以在此处查看有关 Kohana 模块的更多信息。

\n