设计插件的方法


Ways to design plugin

我为我的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()函数,它将返回文本(您的管理区域最终应该呈现它)。

您还可以在对象中包含依赖管理,以防止像您描述的那样崩溃。