在自制 CMS 中安装扩展
Installing extensions in homemade CMS
我出于学习目的(也只是为了好玩)构建了自己的 CMS,但现在我想扩展它,以便它支持一些基本形式的扩展(插件)。我想使用某种观察者模式,其中扩展通过 ExtensionManager
注册自己以进行某些更新(例如 onRenderTitle()
)。每个扩展都将包含一个强制性的 class ExtensionData
,它将为系统中的每个扩展执行。扩展可以通过使用回调在此 class 中注册自己(ExtensionManager
将传递给每个 ExtensionData
class)。
但现在每个扩展都必须在每次页面加载时自行注册(因为 PHP 在每次页面加载之间丢失状态),从而导致潜在的性能问题。
我这样做完全错了吗?或者这是要走的路?我没有编写支持扩展的 CMS 的经验(这正是我想要学习的)。我查看了 Wordpress 如何与扩展一起工作,但我还没有找到它是如何加载它们的。
Wordpress 中的插件只需放在 wp-content/plugins
文件夹中即可注册,并且它们必须在其主文件中包含必要的文档块。这也是 WP 中的约定,您的插件的主文件与您的插件具有相同的名称加上 .php 扩展名,例如plugins/myplugin/myplugin.php
.
就与 CMS 核心的交互而言,您可以让系统触发事件,然后插件会监听它们。 WP 为其使用动作和过滤器。您的简单事件侦听器代码如下所示:
action('action_name', function() {
// some code to be executed after event is fired
});
您的 action()
函数可以只更新全局操作数组。当您想要触发事件时,只需过滤分配的操作数组即可。
foreach ($actions['action_name'] as $func) {
call_user_func($func);
}
我出于学习目的(也只是为了好玩)构建了自己的 CMS,但现在我想扩展它,以便它支持一些基本形式的扩展(插件)。我想使用某种观察者模式,其中扩展通过 ExtensionManager
注册自己以进行某些更新(例如 onRenderTitle()
)。每个扩展都将包含一个强制性的 class ExtensionData
,它将为系统中的每个扩展执行。扩展可以通过使用回调在此 class 中注册自己(ExtensionManager
将传递给每个 ExtensionData
class)。
但现在每个扩展都必须在每次页面加载时自行注册(因为 PHP 在每次页面加载之间丢失状态),从而导致潜在的性能问题。
我这样做完全错了吗?或者这是要走的路?我没有编写支持扩展的 CMS 的经验(这正是我想要学习的)。我查看了 Wordpress 如何与扩展一起工作,但我还没有找到它是如何加载它们的。
Wordpress 中的插件只需放在 wp-content/plugins
文件夹中即可注册,并且它们必须在其主文件中包含必要的文档块。这也是 WP 中的约定,您的插件的主文件与您的插件具有相同的名称加上 .php 扩展名,例如plugins/myplugin/myplugin.php
.
就与 CMS 核心的交互而言,您可以让系统触发事件,然后插件会监听它们。 WP 为其使用动作和过滤器。您的简单事件侦听器代码如下所示:
action('action_name', function() {
// some code to be executed after event is fired
});
您的 action()
函数可以只更新全局操作数组。当您想要触发事件时,只需过滤分配的操作数组即可。
foreach ($actions['action_name'] as $func) {
call_user_func($func);
}