【问题标题】:Making my code easy to write plugins for使我的代码易于编写插件
【发布时间】:2010-06-27 06:35:30
【问题描述】:

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

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

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

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

    //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')
    );
    

这两个想法都非常垃圾,而且它们的使用非常有限,但我正在努力想出更好的想法。

我不确定人们需要多少关于我的代码的信息,但基本的目录结构很简单,下面是一个示例:

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

问题

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

问候

卢克

【问题讨论】:

    标签: php model-view-controller plugins


    【解决方案1】:

    在您开始考虑如何制作插件系统之前,您必须定义插件对您的应用程序而言究竟是什么,插件可以做什么以及插件可以访问哪些数据(例如,posts 表而不是 users 表)。

    然后,看看 Drupal,我想它基于 hooks 的模块系统对于开发人员来说非常强大且“简单”。

    基本上,这个想法是,当安装模块或插件时,您在“核心”代码上所做的一切,都会搜索是否有一些模块/插件与该操作挂钩。

    例子:

    //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 的参数,必须记录得非常好,但是无论您选择什么路径,文档都很重要。

    一些参考:Drupal hookshook_insert

    【讨论】:

    • 感谢 Daniel 的示例代码,在基本动作类构造和破坏函数中的 foreach 循环中进行某种调用是否可行?这样他们总是会在类中任何代码的开始和结束时被调用?感谢您花时间用这么多文档编写上面的示例,它非常清楚。
    • 我的代码只是一个例子,并不是 drupla 的钩子工作的真正方式(你真的必须在 drupal 文档中查看它们)。一些钩子只是“覆盖”基本函数,其他钩子用作“检查”,如果钩子函数返回 true,则执行基本函数,否则不执行。这只是一个指导方针,完全取决于您的具体需求。
    • 感谢 Daniel,提供有用的参考资料和 cmets,我一直在研究 Drupal 代码,它非常有用。干杯
    【解决方案2】:

    您正在寻找的是有关插件架构的示例和/或信息。使用这个词,Google 会发现很多资源。

    检查在 WordPress、Drupal 或 Joomla 等现有成熟应用程序中如何实现这一点。

    同时考虑这个现有问题:Plugin Architecture in PHP

    【讨论】:

    • 嗨乔恩,我看了其他主题,也在谷歌上,我发现了一些论坛帖子(感谢正确的名称“插件架构”)但没有关于 php 的好文章,我要去在某些时候深入研究drupal,看看他们是如何做到的,但您可能不知道一篇专门针对php 的好文章,对吧?干杯卢克
    • 事实上,我只是在谷歌上搜索了“PHP 插件架构”,在第一个结果中发现了这个问题,我认为如果有人告诉谷歌搜索它,那就太糟糕了..跨度>
    猜你喜欢
    • 2020-10-19
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2022-09-25
    • 2017-03-05
    相关资源
    最近更新 更多