插件是独立于原系统的程序模块,目的是在不修改原程序的情况下对系统进行扩展,便于修改和管理。目前web开发中大多是使用钩子形式来定义插件, 比较典型的有
wordpress, drupal系统

ecmall的插件机制:

ecmall提供了3中扩展系统功能的方法. 挂件,模块,插件.
方便我们进行二次开发。下面我们就演示一下如何制作一个插件。
首先在 external/plugins目录下新建一个目录,命名为hello_world,然后进入该目录,新建2个文件
main.plugin.php 和 plugin.info.php。
main.plugin.php
是运行的文件,所以的操作都包含在这个文件内。plugin.info.php
是对该插件的信息,比如:插件名称,作者,功能,版本,钩子等等…下面展示出2个文件的源代码.

main.plugin.php

<?php

class Hello_worldPlugin extends BasePlugin
       
{
                function execute()
                {
               
        echo 'hello world';
                }
        }

?>所有的插件类都必须以插件名称(第一个字母大写) +
‘Plugin’命名,而且是继承BasePlugin类,execute是插件的入口,ecmall会在钩子处调用插件的execute函数
plugin.info.php

<?php

return array(
                'id'             
  =>        'hello_world',
                'name'                =>   
    'hello world',
                'author'        =>        'jack',
 
              'desc'                =>        'hello world',
             
  'hook'                =>        'on_run_action',
        );

?>该文件主要是对插件的描述,id 是插件的名称,必须与文件夹的名称保持一致.
name,author,desc都是可选的参数,但hook必须要填写,它告诉ecmall在什么时候执行该插件,如果不填或者填写错误,该插件将不会起到任何效果.好了,一个简单的ecmall插件就定义好了,然后我们进入后台,在’扩展’->’插件管理’->点击 hello_world
后面的开启 即可

下面我们就来具体的分析一下这个插件的工作流程.

当我们从后台开启一个插件时,ecmall会在 /data
目录下生成一个 plugins.inc.php
的文件,该文件记录了当前系统所有开启的插件信息,我们打开来看一下它的内容

<?php

return array
(
  'on_run_action' =>
  array (
    'short_store_url' =>
 
  array (
    ),
    'hello_world' =>
    array (
   
),
  ),
);

?>返回一个数组,键是hook的名称,代表什么时候执行,值是个多维的数组,代表该hook下所有需要执行的插件.
ecmall程序会用 $this->_hook(‘on_run_action’)的方式来调用插件,_hook函数定义在/includes/ecapp.base.php
文件中,下面贴出主要代码

/* 获取可用插件列表 */
        $plugin_list =
$plugins[$event];
        if (empty($plugin_list))
        {
          
 return null;
        }
        foreach ($plugin_list as $plugin_name
=> $plugin_info)
        {
            $plugin_main_file = ROOT_PATH .
"/external/plugins/{$plugin_name}/main.plugin.php";
            if
(is_file($plugin_main_file))
            {
               
include_once($plugin_main_file);
            }
          
 $plugin_class_name = ucfirst($plugin_name) . 'Plugin';
            $plugin =
new $plugin_class_name($data, $plugin_info);
            $this->outcall =
true;

/* 返回一个结果,若要停止当前控制器流程则会返回true */
          
 $stop_flow = $this->_run_plugin($plugin);
            $plugin =
null;
            $this->outcall = false;可以看到,ecmall 会循环 包含当前hook下的插件文件,然后
$this->run_pugin($plugin) 来执行, 而 _run_plugin
其实就是调用插件的execute函数,整个插件流程就这样串联起来

function
_run_plugin(&$plugin)
    {
        $plugin->execute();
   
}
总结,
虽然ecmall提供的插件机制可以让我们很简单的进行扩展,但是目前系统自带的hook太少(只有5种),与wordpress的几十种来说还相差甚远,
所以很多情况下我们都不得不自己添加一些hook来应对我们的需求.

浅谈ecmall插件机制的更多相关文章

  1. 浅谈 Golang 插件机制

    我们知道类似 Java 等半编译半解释型语言编译生成的都是类似中间态的字节码,所以在 Java 里面我们想要实现程序工作的动态扩展,可以通过 Java 的字节码编辑技术([[动态代理#ASM]]/[[ ...

  2. 浅谈Nutch插件机制(含开发实例)

    plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较普遍的用来分析nutch抓取的html文件的插件. 为什么nutch要使用这样的plugin系统? ...

  3. 浅谈JVM线程调度机制及主要策略

    在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...

  4. 浅谈java发射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  5. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  6. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

  7. 浅谈Java回调机制

    像许多网上介绍回调机制的文章一样,我这里也以一个现实的例子开头:假设你公司的总经理出差前需要你帮他办件事情,这件事情你需要花些时间去做,这时候总经理肯定不能守着你做完再出差吧,于是就他告诉你他的手机号 ...

  8. 浅谈java编译机制和运行机制

    源文件和字节码的组成方式 源文件: 拓展名后跟java的文件即java的源文件. Java 源码编译由以下三个过程组成: 1.分析和输入到符号表 2.注解处理 3.语义分析和生成class文件 流程图 ...

  9. 浅谈利用同步机制解决Java中的线程安全问题

    我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...

随机推荐

  1. CodeForces - 91B单调队列

    有一个数列,对于每一个数,求比它小的在他右边距离他最远的那个数和他的距离 用单调队列做,维护单调队列时可采用如下方法,对于每一个数,如果队列中没有数,则加入队列,如果队列头的数比当前数大,则舍弃该数 ...

  2. 安装Linux环境

    虚拟机:虚拟机(Virtual Machine),在计算机科学中的体系结构里,是指一种特殊的软件,他可以在计算机平台和终端用户之间建立一种环境,而终端用户则是基于这个软件所建立的环境来操作软件.在计算 ...

  3. canvas线性变换、颜色和样式选择

    1.应用不同的线型 ctx.lineWidth = value; 线条的宽度,默认为1 ctx.lineCap = type; 设置端点样式, type默认为butt,可选值round,square, ...

  4. 控制台小游戏-贪吃蛇,c++和c#版

    说是c++版,其实只是用到了c++的cout和cin而已.这是我做的第二个控制台游戏,基本上每一行代码都加上了注释. 游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有 ...

  5. Esper——内存计算、事件驱动、SQL支持

    教程简介Esper是一个事件流处理(ESP)和事件关联引擎(CEP的,复杂事件处理).Esper的目标是针对实时事件驱动架构(EDA).当Esper监测到事件流中又符合条件的时间发生时,即可触发Pla ...

  6. RxJava 详解

    给 Android 开发者的 RxJava 详解: http://gank.io/post/560e15be2dca930e00da1083#toc_1

  7. 【css】响应式布局入门【转】

    最近研究响应式设计框架的时候,发现网上很多相关的属性介绍,却很少有系统的入门级使用的文章,我自己整理了一篇入门知识,并没有什么高深的理论,也不牵扯到框架. 目前已经越来越多的站点以及wap站点使用响应 ...

  8. 【linux】VirtualBox-“please use a kernel appropriate for your cpu”

    This kernel requires the following features not present on the CPU:paeUnable to boot – please use a ...

  9. Android程序员学WEB前端(4)-HTML(4)-注册页面-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76576031 觉得博文有用,请点赞,请评论,请关注,谢谢!~ 注册页面1: <! ...

  10. fedora 26 Mysql

    安装 Fedora用dnf默认安装的使Mariadb,即 [*****@localhost ~]$ sudo dnf install mysql-server ... [*****@localhost ...