例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。

事件系统的所有操作都通过\Zero\Plugin\Manager.php类进行静态调用

定义事件

事件系统使用了观察者模式,提供了解耦应用的更好方式。在你需要监听事件的位置,例如下面我们在用户完成下单操作之后添加如下事件触发代码:

// 触发init_order_add事件
Zero_Plugin_Manager::getInstance()->trigger('init_order_add', argv...)

或者使用助手函数

$flag_row = do_action('init_order_add', $base_row, $item_rows);

事件监听

你可以手动注册一个事件监听

Zero_Plugin_Manager::getInstance()->register('init_order_add', callback);
<?php
class Plugin_Sys implements Zero_Plugin_Interface
{
    function __construct()
    {
        Zero_Plugin_Manager::getInstance()->register('init_order_add', $this, 'initOrderAdd');
    }

    /**
     * 添加订单事件
     *
     * @param  array $base_row 订单基础数据
     * @param  array $item_rows 订单商品数据
     *
     * @access public
     * @return int
     */
    public function initOrderAdd($base_row, $item_rows)
    {
        return $flag;
    }
}



内置事件

内置的系统事件包括:

事件主要为插件服务的

插件的注册和声明

class Plugin_Activity implements Zero_Plugin_Interface {
    public function __construct()
    {
        //注册插件
        //第一个参数是钩子的名称
        //第二个参数是pluginManager的引用
        //第三个是插件所执行的方法
        Zero_Plugin_Manager::getInstance()->register('activity_data', $this, 'getActivityData');
    }

    public function getActivityData($arg1, $arg2 ...)
    {
        //插件的实现
    }

}

插件的使用

一、通过do_action()方法

  1. 第一个参数是钩子的名称
  2. 最后一个是插件类,如果存在,则则单一触发
  3. 中间是传递给插件的参数
    $activity_data = do_action('activity_data', $arg1, $arg2 ..., 'PluginName');

二、通过apply_filters()方法

  1. 第一个参数是钩子的名称
  2. 第二个参数为需要过滤的数据,修改后返回。
  3. 最后一个是插件类,如果存在,则则单一触发
    $activity_data = apply_filters('activity_data', $data, 'PluginName');

三、通过插件管理类trigger()来触发

  1. 第一个参数是钩子的名称
  2. 其他参数是传递给插件的参数
    $PluginManager = Zero_Plugin_Manager::getInstance();
    $PluginManager->trigger('product_evaluate_done', $field_row);
文档更新时间: 2020-05-28 16:24   作者:随商信息技术(上海)有限公司