例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了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()方法
- 第一个参数是钩子的名称
- 最后一个是插件类,如果存在,则则单一触发
- 中间是传递给插件的参数
$activity_data = do_action('activity_data', $arg1, $arg2 ..., 'PluginName');
二、通过apply_filters()方法
- 第一个参数是钩子的名称
- 第二个参数为需要过滤的数据,修改后返回。
- 最后一个是插件类,如果存在,则则单一触发
$activity_data = apply_filters('activity_data', $data, 'PluginName');
三、通过插件管理类trigger()来触发
- 第一个参数是钩子的名称
- 其他参数是传递给插件的参数
$PluginManager = Zero_Plugin_Manager::getInstance(); $PluginManager->trigger('product_evaluate_done', $field_row);
文档更新时间: 2020-05-28 16:24 作者:随商信息技术(上海)有限公司