Skip to content

Latest commit

 

History

History
166 lines (140 loc) · 3.44 KB

18.事件.md

File metadata and controls

166 lines (140 loc) · 3.44 KB

事件

  • 事件对象
<?php 
namespace extend\event;

/**
 * Class Entity
 * User Jiang Haiqiang
 */
class Entity
{
    /**事件名称
     * @var string $name
     */
    public $name;

    /**事件触发者
     * @var object $sender
     */
    public $sender;

    /**事件是否已经被处理,如果handled为true,其他handler不会再接收到通知
     * @var bool $handled
     */
    public $handled = false;

    /**数据
     * @var mixed $data
     */
    public $data;
}
?>
  • 事件traits
<?php
namespace extend\event;

/**
 * Trait Event
 * @package extend\event
 * User: Jiang Haiqiang
 */
trait Event
{
    /**
     * @var array $_events
     */
    protected $_events = [];

    /**
     * 绑定事件
     * @param string     		$name
     * @param \Closure | array  $handler
     * @param bool 				$append
     * Author: Jiang Haiqiang
     * Email : jhq0113@163.com
     * Date: 2018/6/27
     * Time: 11:01
     */
    public function on($name, $handler, $append = true)
    {
        $this->_events[ $name ] = isset($this->_events[ $name ]) ? $this->_events[ $name ] : [];

        $append ? array_push($this->_events[ $name ],$handler) : array_unshift($this->_events[ $name ],$handler);
    }

    /**
     * 解绑事件
     * @param string     $name
     * @param null       $handler
     * @return bool
     * Author: Jiang Haiqiang
     * Email : jhq0113@163.com
     * Date: 2018/6/27
     * Time: 11:01
     */
    public function off($name, $handler = null)
    {
        if (!isset($this->_events[ $name ])) {
            return false;
        }

        //移除所有$name事件的handler
        if ($handler === null) {
            unset($this->_events[ $name ]);
            return true;
        } else {
            $removed = false;
            foreach ($this->_events[ $name ] as $index => $eventHandler) {
                if ($eventHandler === $handler) {
                    unset($this->_events[ $name ][ $index ]);
                    $removed = true;
                }
            }

            if ($removed) {
                $this->_events[ $name ] = array_values($this->_events[ $name ]);
            }

            return $removed;
        }
    }

    /**
     * 是否有handler
     * @param string $name
     * @return bool
     * Author: Jiang Haiqiang
     * Email : jhq0113@163.com
     * Date: 2018/6/27
     * Time: 11:01
     */
    public function hasHandlers($name)
    {
        if (isset($this->_events[ $name ]) && !empty($this->_events[ $name ])) {
            return true;
        }

        return false;
    }

    /**
     * 触发事件
     * @param string  $name
     * @param null    $event
     * Author: Jiang Haiqiang
     * Email : jhq0113@163.com
     * Date: 2018/6/27
     * Time: 11:01
     */
    public function trigger($name, $event = null)
    {
        if (empty($this->_events[ $name ])) {
            return;
        }

        if ($event === null) {
            $event = new Entity();
        }

        $event->handled = false;
        $event->name = $name;

        
        foreach ($this->_events[ $name ] as $handler) {
            call_user_func($handler, $event);

            //标记已处理,停止后续处理
            if ($event->handled) {
                return;
            }
        }
        
    }
}