我开始一个新的web应用程序在PHP和这一次,我想创建一些东西,人们可以通过使用插件接口扩展。

如何在他们的代码中编写“钩子”,以便插件可以附加到特定的事件?


当前回答

雅虎的Matt Zandstra有一个叫做Stickleback的项目,它处理了很多PHP插件的处理工作。

它加强了插件类的接口,支持命令行接口,并且安装和运行起来并不太难——特别是如果您阅读了PHP架构师杂志上关于它的封面故事。

其他回答

我相信最简单的方法是遵循Jeff自己的建议,查看一下现有的代码。试着看看WordPress、Drupal、Joomla和其他知名的基于php的CMS,看看它们的API挂钩的外观和感觉如何。通过这种方式,您甚至可以获得您以前可能没有想到的想法,从而使事情变得更加健壮。

一个更直接的答案是将通用文件“include_once”写入文件,以提供所需的可用性。这将被分解成类别,而不是在一个巨大的“hooks.php”文件中提供。但是要小心,因为最终发生的情况是,它们包含的文件最终具有越来越多的依赖关系,功能也得到了改进。尽量保持较低的API依赖性。也就是要包含更少的文件。

好的建议是看看其他项目是如何做到这一点的。许多人要求安装插件,并为服务注册插件的“名称”(就像wordpress那样),这样在代码中就有了“点”,可以调用一个函数来标识已注册的侦听器并执行它们。一个标准的OO设计模式是观察者模式,在真正面向对象的PHP系统中实现它是一个很好的选择。

Zend Framework使用了许多钩子方法,并且架构非常好。这是一个很好的系统。

我很惊讶,这里的大多数答案似乎都是关于web应用程序的本地插件,即运行在本地web服务器上的插件。

如果你想让插件在另一个远程服务器上运行呢?最好的方法是提供一个表单,允许您定义不同的url,当应用程序中发生特定事件时将调用这些url。

不同的事件会根据刚刚发生的事件发送不同的信息。

这样,您只需对提供给应用程序的URL(例如通过https)执行cURL调用,远程服务器可以根据应用程序发送的信息执行任务。

这提供了两个好处:

您不必在本地服务器上托管任何代码(安全性) 代码可以在远程服务器上(可扩展性),使用PHP以外的不同语言(可移植性)

钩子和监听器方法是最常用的方法,但您还可以做其他事情。取决于你的应用程序的大小,以及你允许谁看到代码(这将是一个自由/开源软件脚本,还是内部的东西)将极大地影响你想要如何允许插件。

Kdeloach有一个很好的例子,但是他的实现和钩子函数有点不安全。我想请你给更多的信息,php应用程序的性质,你写的,以及你如何看待插件适合。

+1给我。

雅虎的Matt Zandstra有一个叫做Stickleback的项目,它处理了很多PHP插件的处理工作。

它加强了插件类的接口,支持命令行接口,并且安装和运行起来并不太难——特别是如果您阅读了PHP架构师杂志上关于它的封面故事。