【问题标题】:How to modularize a plugin/extension feature for a php app?如何模块化 php 应用程序的插件/扩展功能?
【发布时间】:2013-03-01 18:50:22
【问题描述】:

我正在开发一个供我公司使用的任务管理应用程序。规范的一部分是创建一个插件系统,允许用户根据需要或部门需要自定义和扩展功能。我很想以一种非常优雅和模块化的方式来做这件事,但我很难弄清楚如何做。

考虑一个任务列表视图:生成循环的每次迭代都会在任一端添加一个 pre_task()post_task() 调用,这会在任务标题的任一端构建交互式片段(完成复选框、cmets 链接、 ETC)。现在,当系统检测到并包含插件文件 plugin_time_tracking.php 时,插件应该向 post_task() 添加功能 - 除了其他所有内容之外,还添加一个“跟踪时间”按钮。

我想要完成的是让插件“挂钩”到 pre_task() 或 post_task() - 让它通过将自身附加到适当的函数并扩展它们来完成所有的工作,而不是使用核心排序插件并将它们的功能集中到正确的位置。 PHP 是否提供这样的功能?我会以错误的方式解决这个问题吗?让我知道是否需要澄清 - 感谢您的帮助!

【问题讨论】:

标签: php plugins module hook


【解决方案1】:

Qafoo 的男孩们在 2012 年的 PHPBenelux 会议上发表了关于模块化的演讲。他们提出了创建模块化应用程序的各种选项,例如挂钩、修补和继承。

您可以查看该演示文稿的幻灯片here

【讨论】:

  • 正是我想要的。谢谢!
【解决方案2】:

我认为您应该真正使用具有内置插件基础架构的框架,该基础架构具有覆盖/继承功能。例如,让我们说 Symfony2。在 sf2 中,您可以创建 FormType 类来构建表单对象(然后将某些数据传递给他的视图)。因此,在这种情况下,要添加字段,另一个团队只需要扩展您的 FormType 并修改构建以添加新字段。此外,Form Api 还支持嵌入子表单,因此如果他们想要时间跟踪,那么只需将其嵌入到任务表单中或通过您提供的任何配置工具“打开它”。

与渲染事物类似,您可以简单地通过在不同级别提供或引用不同的 Bundle(某种插件)来定义覆盖视图模板。

现在 Symfony2 非常复杂,并且学习曲线很高,所以它可能是也可能不是您应该选择的框架,但沿着这些思路的东西会更合适。 “钩子”函数的 WP/Drupal 模式使用起来非常烦人,尤其是当它们在更深的层上构建 HTML 字符串并且没有为您提供您认为合适的原始数据以输出时。

【讨论】:

  • 感谢您的建议!我在这里受到 TTL 的限制,所以学习曲线越小越好。你能推荐一些不那么健壮、更开箱即用的东西吗?
  • 你的 TTL 是多少,你对 OOP 有多少经验?
  • 我将自己置于 OOP 的中间阶段 - 他们希望在月底前进行部署,这给了我大约两周的时间来启动这部分系统
  • 这有点粗糙,因为你将在学习任何框架的过程中。 Laravel 可能是一个不错的选择。我在这里它有一个相当小的学习曲线,它有一个捆绑系统。我不确定他们的捆绑包是如何工作的,所以我不知道它是否符合我的建议,但你可能想看看它。
  • 这可能会有所帮助:stackoverflow.com/questions/4471183/…
猜你喜欢
  • 2014-02-15
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2023-03-22
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多