如何模块化一个php应用的插件/扩展特性


How to modularize a plugin/extension feature for a php app?

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

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

我想要完成的是使插件"挂钩"到pre_task()或post_task()上-让它通过将自己附加到适当的函数并扩展它们来完成所有的跑腿工作,而不是让核心排序插件并将其函数羊群到正确的地方。PHP提供这样的功能吗?我是不是走错路了?让我知道,如果我需要澄清在所有-谢谢你的帮助!

Qafoo的小伙子们在2012年版的PHPBenelux会议上做了一个关于模块化的演讲。他们提供了创建模块化应用程序的各种选项,如钩子、补丁和继承。

你可以在这里查看那次演讲的幻灯片

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

与渲染类似,你可以通过在不同的级别提供或引用不同的Bundle(各种插件)来定义重写视图模板。

现在Symfony2是非常复杂的,它有一个很高的学习曲线,所以它可能或可能不是你应该选择的框架,但沿着这些线的东西将是更合适的。WP/Drupal的"hook"模式函数是令人难以置信的讨厌的工作,特别是如果他们是在更深的层上构建HTML字符串,而不是给你输出原始数据,你认为合适的