使我的代码易于编写插件

时间:2010-06-26 21:13:57

标签: php model-view-controller plugins

我一直在编写一些创建通用博客的代码。

它的功能很简单,创建帖子,编辑和删除帖子并允许评论。

我正在尝试编写它,以便编写插件非常容易,但我不确定最佳方法。
我的一些想法:

  1. 让插件作者编写一个名为“config”的简短脚本,其中有一个包含应用程序的数组(例如前端,管理员等),模块(例如博客,个人资料等)和动作( s)(例如创建,编辑等)插件影响,然后在运行正确的操作时包含插件文件。

    //example array in config.php:
    array(
      'application' => 'admin',
      'module'      => 'blog',
      'action'      => array('create','edit')
    );
    
  2. 将字符串添加到视图代码中,例如“{form-extras}”,并让插件作者说出代码将替换哪个字符串。然后使用str_replace将{xxx}替换为插件代码。

    #example code in blog_form.php
    <input type="text" name="blog_title" />
    <input type="text" name="blog_text" />
    {form-extras}
    
    #example code in plugins config.php
    array(
      'replace' => array('form-extras')
    );
    
  3. 这两种想法都很垃圾,使用起来非常有限,但我很难想出更好的想法。

    我不确定我的代码需要多少信息,但基本的dir结构很简单,下面是一个例子:

    apps //applications
      frontend  //app name
        modules
          blog
            views
              index.php  //list blogs
              new.php //create new blog post
            actions.class.php
      admin
        modules
          blog
            views
              index.php  //list blogs
              new.php //create new blog post
            actions.class.php
    lib //library of classes like database class
    plugins //where plugins will hopefully be installed
    web //where the site runs e.g index.php, all the css and js
    

    问题

    有没有人知道有关使代码易于编写插件的任何教程/文章,或者是否有人有任何我可以应用的测试方法?

    问候

2 个答案:

答案 0 :(得分:4)

在开始考虑如何制作插件系统之前,您必须为您的应用程序定义插件的确切内容,插件可以执行的操作以及插件可以访问的数据(例如,发布表但不包含用户表)。

然后,看看Drupal,我猜它基于钩子的模块系统真的很强大,而且“简单”可供开发人员使用。

基本上,我们的想法是,当你安装了一个模块或插件时,你在'核心'代码上做的每一件事,都会搜索是否有一些模块/插件挂钩到那个动作。

示例:

//your code
$modules_enabled = array('foo', 'bar');
//example action, lets say insert a new blog post. Obviously, nothings prevent you
//to do that in OOP style (i'd never really understood why drupal is almost all procedural).
function create_new_post($modules_enabled, $other_args){
    //looks if some modules need to be called before create the blog post
    foreach($modules_enables AS $module){
        if(function_exists("after_create_new_post_$module")){
            $func = "before_create_new_post_$module";
            $func($params);
        }
    }
    //do your stuff here
    //looks if some modules need to be called after the post is been created
    foreach($modules_enables AS $module){
        if(function_exists("after_create_new_post_$module")){
            $func = "after_create_new_post_$module";
            $func($params);
        }
    }
}

//the module file should look like $hooks_name . $module_name:
function after_create_new_post_foo($args){
    //do your job
}

这是一个非常非常有特色的例子(并且不起作用!),但是应该给你一个想法。

这里唯一的问题是你传递给每个hook_function的args,必须记录得非常好,但是无论你选择什么路径,文档都很重要。

一些参考:Drupal hookshook_insert

答案 1 :(得分:2)

您正在寻找的是有关插件架构的示例和/或信息。使用这个术语,谷歌将揭示许多资源。

检查如何在现有的已建立的应用程序(如WordPress,Drupal或Joomla)中实现这一目标。

还要考虑这个现有问题:Plugin Architecture in PHP