设计插件的方法

时间:2011-09-16 12:32:33

标签: php plugins

我为我的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*/
  }
?>

2 个答案:

答案 0 :(得分:1)

您不应该以文本方式替换内容,而应该使用面向对象的体系结构,其中子类可以覆盖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的类型)。 / p>

答案 1 :(得分:0)

更有条理的方式是Object Oriented。例如,构建一个抽象的Plugin基类并在插件中扩展它。

对于您的管理区域,您可以创建一个AdminPlugin,其中包含一些其他要求和/或添加的基本功能。就像getText()函数一样,返回文本(你的管理区域最终应该呈现它)。

您还可以在对象中包含依赖关系管理,以防止您所描述的崩溃。