phossa/phossa-event

PHP 的事件管理库

1.0.7 2016-05-27 03:38 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:47:39 UTC


README

Build Status Latest Stable Version License

查看新库phoole/event 简介

Phossa-event 是一个 PHP 的事件管理库。它仅从 phossa/phossa-shared 解耦。它只要求 PHP5.4。

安装

通过 composer 工具安装。

composer require "phossa/phossa-event=1.*"

或添加以下行到您的 composer.json

{
    "require": {
       "phossa/phossa-event": "1.*"
    }
}

简单的 EventDispatcher

使用 Phossa\Event\EventDispatcher 进行简单的事件分发

  • 简单用法

    $dispatcher = new EventDispatcher();
    
    // bind event 'user.login' to a callable
    $dispatcher->on('user.login', function(Event $evt) {
        // ...
    });
    
    // trigger the 'user.login' event, passing data
    $dispatcher->trigger('user.login', [ 'user' => $user ]);

    或使用静态(全局分发)

    // bind event with priority 60 (0 - 100, high # higher priority)
    EventDispatcher::on('user.login', function(Event $evt) {
        // ...
    }, 60);
    
    // trigger the 'user.login' event
    EventDispatcher::trigger('user.login', [ 'user' => $user ]);
  • 触发有限次

    // bind event for once
    $dispatcher->one('user.login', function(Event $evt) {
        // ...
    });
    
    // allow 3 times
    $dispatcher->many('user.tag', 3, function(Event $evt) {
        // ...
    });
  • 事件通配符

    // globbing
    $dispatcher->on('user.*', function(Event $evt) {
        //...
    });
  • 断开事件

    // detach
    $dispatcher->off('user.*');
  • 监控 PHP 错误

    PHP 错误发生时执行一个可调用的函数。

    // callable returns bool
    $dispatcher->error(function($errno$errstr$errfile$errline) {
        // ...
        return true;
    });
  • 脚本结束时执行一个可调用的函数

    // run this after script ends
    $dispatcher->ready(function() {
        // ...
    });

完整的 EventManager

使用 Phossa\Event\EventManager 进行复杂的事件管理,全面支持事件监听器、事件主题、本地事件管理器和全局事件管理器等。

  • 事件监听器

    use Phossa\Event\Interfaces;
    
    class MyListener implements Interfaces\EventListenerInteface
    {
        /*
         * Get events and callables MyListener listens to
         */
        public function getEventsListening()
        {
            return array(
                'eventName1' => 'method1', // method1 of $this
                'eventName2' => array('method2', 20), // priority 20
                'eventName3' => array( // multiple callables
                    [ 'method3', 70 ],
                    [ 'method4', 50 ]
                )
            );
        }
    }
    
    $listener = new MyListener();
  • 事件管理器

    // create an event manager
    $evtManager = new Event\EventManager();
    
    // attach a listener object
    $evtManager->attachListener($listener);
    
    // attach a callable directly to 'oneSpecialEvent'
    $callable = function(Event\Event $evt) {
        ...
    };
    $evtManager->attachListener($callable, 'oneSpecialEvent');
    
    // detach a callable
    $evtManager->detachListener($callable);
  • 具有事件感知的主题

    use Phossa\Event\Interfaces;
    
    class MyEventAware implements Interfaces\EventAwareInterface
    {
        // add setEventManager() and triggerEvent()
        use Interfaces\EventAwareTrait;
    
        ...
    }
    
    $subject = new MyEventAware();
  • 组合在一起

    // set manager to event-aware subject
    $subject->setEventManager($evtManager);
    
    // trigger event
    $subject->triggerEvent('eventName2');
  • 事件通配符

    可以通过使用 '' 或 'event' 来监听所有事件。

    use Phossa\Event\Interfaces\EventListenerInterface;
    
    class Listener implements EventListenerInterface
    {
        public function getEventsListening()
        {
            return [
                'evtTest1' => 'testC',
                'evtTest2' => [ 'testD', 20 ],
                'evtTest3' => [
                    [ 'testA', 70 ],
                    [ 'testB', 50 ]
                ],
                // globbing
                'evt*' => 'bingo',
                'evtTest*' => 'bingo2',
                '*' => 'wow',
            ];
        }
    }
  • 静态类的事件管理

    静态监听器类

    use Phossa\Event\Interfaces;
    
    class StaticListener implements Interfaces\EventListenerStaticInteface
    {
        /*
         * Get events and callables StaticListener listens to
         */
        public static function getEventsListening()
        {
            return array(
                'eventName1' => 'method1', // method1 of $this
                'eventName2' => array('method2', 20), // priority 20
                'eventName3' => array( // multiple callables
                    [ 'method3', 70 ],
                    [ 'method4', 50 ]
                )
            );
        }
    }

    用于事件的静态主题类

    use Phossa\Event\Interfaces;
    
    class StaticEventAware implements Interfaces\EventAwareStaticInterface
    {
        // add setEventManager() and triggerEvent()
        use Interfaces\EventAwareStaticTrait;
    
        ...
    }

    静态主题类触发事件如下

    // create an event manager/dispatcher
    $evtManager = new Event\EventManager();
    
    // attach a static listener class
    $evtManager->attachListener(StaticListener::CLASS);
    
    // set manager/dispatcher to event-aware static subject class
    StaticEventAware::setEventManagerStatically($evtManager);
    
    // trigger event by the static subject class
    StaticEventAware::triggerEventStatically('eventName2');
  • 组合事件管理器

    可以如下使用组合事件管理器

    use Phossa\Event;
    
    // global event manager
    $global_manager = new Event\EventManager();
    $global_manager->attachListener($some_global_event_listener);
    
    // local event manager
    $local_manager  = new Event\Variation\EventManagerComposite();
    $local_manager->attachListener($local_listener);
    
    // allow local event manager dispatch events to global event manager
    $local_manager->setOtherManager('global', $global_manager);
    
    // the event aware subject
    $subject = new MyEventAware();
    
    // set event manager
    $subject->setEventManager($local_manager);
    
    // fire up an event, will look into event handling queue from both
    // $local_manager and $global_manager
    $subject->triggerEvent('some_event');
  • 不可变事件管理器

    use Phossa\Event;
    
    // low-level manager to hide
    $_evtManager = new EventManager();
    $_evtManager->attachListener(...);
    ...
    
    // expose an immutable event managet to user
    $evtManager = new Variation\ImmutableEventManager($_evtManager);
    
    // cause an exception
    $evtManager->detachListener( ... );
  • 可共享的事件管理器,全局管理器只有一个副本,而有很多本地管理器。

    // get global copy by using static method `getInstance()`
    $globalEventManager = ShareableEventManager::getInstance();
    
    // normal event managers
    $localEventManager  = new ShareableEventManager();
    
    // is this the global copy?
    if ($evtManager->isShareable()) {
        ...
    } else {
        ...
    }

特性

  • 支持 PHP 5.4+、PHP 7.0+、HHVM。

  • PHP7 支持返回类型声明和参数类型声明。

  • 遵守 PSR-1、PSR-2、PSR-4。

  • 解耦的包可以在不使用框架的情况下单独使用。

依赖

  • PHP >= 5.4.0

  • phossa/phossa-shared >= 1.0.8

许可

MIT 许可