我为我的CMS设计了两种形式的插件,但我有一个问题。第一个将在模板中实现,这很酷,没有问题。但是第二个是我的管理区域,我是这样设计的
首先我定义了一个指令文件,它是一个文本文件,内容如下:
REPLACE_INLINE("sample.php","//Echo/*","//Echo*/","echo '"test'"","echo '"new test'"");
在我的插件安装函数我拆分这些参数,我去做他们,最后我保存新的内容。它工作得很好,但我想知道,这是设计插件的正确方式吗?我认为它不是,所以我发布了一个主题。
顺便说一下,我的sample.php文件我假设它是我的CMS的源文件之一包含这些数据:<?php
function showText(){
//Echo/*
echo "test";
//Echo*/
}
?>
还有一件事,如果我这样做,也许下一次另一个插件想要与echo "test"交互一些数据;如果它不像主模板,我们就会爆炸!崩溃。
插件安装后的sample.php数据:
<?php
function showText(){
//Echo/*
echo "new test";
//Echo*/
}
?>
不需要在文本上替换内容,您应该使用面向对象的体系结构,其中子类可以覆盖showText
(和/或调用旧的实现)或使用回调,像这样:
$plugin_callbacks = array();
function showText() {
$text = 'test';
foreach ($plugin_callbacks as $cb) {
$text = call_user_func($cb, $text);
}
echo $text;
}
$plugin_callbacks[] = function($text) {
return 'new text';
}
$plugin_callbacks[] = function ($text) {
return '<b>' . $text . '</b>';
};
然而,正如您所看到的,这很快就会变得混乱。因此,除非回调的数量非常有限,否则请使用面向对象的设计(这将要求您拥有一个实例化工厂,插件可以在其中注册并确定echoObject的类型)。
更有组织的方法是面向对象。例如,构建一个抽象的Plugin
基类,并在你的插件中扩展它。
对于您的管理区域,您可以创建具有一些额外要求和/或添加基本功能的AdminPlugin
。就像getText()
函数,它将返回文本(您的管理区域最终应该呈现它)。
您还可以在对象中包含依赖管理,以防止像您描述的那样崩溃。