10.0.事件

事件系统

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前, 进行拦截然后在之前或之后加入某些操作。 拦截是AOP的一种实现策略。

谈到拦截器,还有一个词大家应该知道—— 拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。 拦截器链就是将拦截器按一定的顺序联结成一条链。 在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

Aspect(切面):横向切面关系被成组的放进一个类中。 Advice(通知):用于调用切面,定义某种情况下做什么和什么时间做这件事情。 通知又分为:前通知、返回后通知、抛出后通知和周边通知。

Joinpoint(接入点):创建通知的位置。 Pointcut(点切割):定义了一种把通知匹配到某些接入点的方式。

使用方法

//#门面方法
use qing\facades\Event;
//触发事件点
Event::trigger(self::E_APP_INITED);
Event::trigger('app_inited');

//#原始组件方法
com('event')->trigger('app_inited');

接口

interface EventManagerInterface{
    /**
     * 是否绑定有监听器
     *
     * @param string $name
     * @return boolean
     */
    public function has($name);
    /**
     * - 绑定一次性的处理器/监听器
     * - 监听器执行一次后移除
     *
     * @see attach one once
     * @param string    $name               事件点
     * @param callback  $listener   监听器
     * @param number    $priority   监听器优先级
     */
    public function once($name,$listener,$priority=10);
    /**
     * 绑定注册事件监听器/处理器
     *
     * array 键值不能是float
     * 一个事件处理器必须是有效的php回调。
     * [处理器,调用优先级]
     *
     * @name bind on attach register
     * @param string    $name               事件点
     * @param callback  $listener   监听器
     * @param number    $priority   监听器优先级/int/float
     */
    public function bind($name,$listener,$priority=10);
    /**
     * - 解绑某个事件点的所有监听器
     * - 解绑某个事件点的某个监听器
     *
     * @name  unbind detach unregister
     * @param string $name      事件名称
     * @param mixed  $listener  监听器
     */
    public function unbind($name,$listener='');
    /**
     * 触发/监听某个事件点
     * 执行所有监听器
     *
     * @name trigger listen emit fire
     * @param string $name
     * @param mixed  $data
     * @return \qing\event\Event
     */
    public function trigger($name,$data=null);
}

绑定事件监听器

/**
 * 绑定注册事件监听器/处理器
 *
 * @param string    $name       事件点
 * @param callback  $listener   监听器
 * @param number    $priority   监听器优先级/int/float
 */
public function bind($name,$listener,$priority=10);

优先级


Event::bind($hook,function(){ echo '12';},12);
//优先级相同,先绑定优先级高
Event::bind($hook,function(){ echo '10';},10);
Event::bind($hook,function(){ echo '10.2';},10);
Event::bind($hook,function(){ echo '8';},8);

Event::trigger($hook);

//执行结果从小到大
8
10
10.2
12

触发事件点 trigger

/**
 * 触发事件点,执行监听器链
 *
 * @param string $name
 * @param mixed  $data
 */
public function trigger($name,$data=null);

传入数据包

案例

use qing\facades\Event;

//事件点名称/钩子名称
$hook='hook01';

//#绑定事件监听器
Event::bind($hook,function(){ echo '12';},12);
//优先级相同,先绑定优先级高
Event::bind($hook,function(){ echo '10';},10);
Event::bind($hook,function(){ echo '10.2';},10);
Event::bind($hook,function(){ echo '8';},8);

//#判断该事件点是否绑定有监听器
if(!Event::has($hook)){
    //绑定一次性的监听器,监听器执行一次后移除,不管事件点触发多少次
    Event::once($hook,function(){ echo '3';},3);
}
//#触发事件
Event::trigger($hook);

//#解绑事件点
Event::unbind($hook);

//#触发事件
Event::trigger($hook);