模仿Laravel的事件管理器

Laravel事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。

 

配置文件

<?php
use Event\Event;

Event::listen('ON_TEST', [
    'Event\Listeners\Test', function($msg){
        echo $msg.':函数方式';
        echo "<br />";
    },
    'Event\Listeners\Test@add'
]);


//综合单废除以后
Event::listen('wws_abolished', ['\Event\Listeners\PaintOrderListener@abolish']);

 事件服务类

<?php
/**
 * 一个简单的事件服务
 */

namespace Event;


class Event
{

    protected $listen;

    protected static $instance = null;

    private function __construct() {
    }

    public static function getInstance() {
        if (empty(static::$instance)) {
            static::$instance = new self();
        }
        return static::$instance;
    }

    protected function parseClassCallable($listener) {
        $segments = explode('@', $listener);

        return [$segments[0], count($segments) == 2 ? $segments[1] : 'handle'];
    }

    public function createClassListener($listener) {
        list($class, $method) = $this->parseClassCallable($listener);

        return function () use ($class, $method) {
            return call_user_func_array(
                [$class, $method], func_get_args()
            );
        };
    }

    //事件配置文件
    public static function boot($config) {
        include_once($config);
    }

    public function hasListen($event) {
        return isset($this->listen[$event]);
    }

    public static function once($event, $callback) {
        $self = static::getInstance();
        if (!$self->hasListen($event)) {
            static::listen($event, $callback);
        }
    }

    //注册监听器
    public static function listen($event, $callback) {
        if (!is_array($callback)) {
            $callback = [$callback];
        }
        $self = static::getInstance();

        foreach ($callback as $item) {
            if (is_callable($item)) {
                $self->listen[$event][] = $item;
            }
            if (is_string($item)) {
                $self->listen[$event][] = $self->createClassListener($item);
            }
        }
    }

    //要触发一个事件,可以使用Event门面,传递一个事件实例到fire方法,fire方法会分发事件到所有监听器
    public static function fire() {
        $args = func_get_args();
        $event = array_shift($args);
        $args[] = $event;
        $self = static::getInstance();
        foreach ($self->listen[$event] as $callback) {
            if (is_callable($callback)) {
                $result = call_user_func_array($callback, $args);
                if (false === $result) { //如果事件处理报错则终止向下传递
                    return false;
                }
            }
        }
    }

} 

 处理小例子

<?php
namespace Event\Listeners;

class Test 
{

    public function handle($msg)
    {
        echo $msg.':不指定方法';
        echo '<br/>';
    }

    public function add($msg)
    {
        echo $msg.":指定方法";
        echo "<br />";
    }
} 

 调用事件

//ON_TEST:不指定方法
//ON_TEST:函数方式
//ON_TEST:指定方法
Event::boot(CONF_PATH.'event.php');
Event::fire('ON_TEST');

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值