花粉解决方案 - 事件组件 - PSR-14 事件分发器。

v1.0.1 2021-07-07 00:00 UTC

This package is auto-updated.

Last update: 2024-09-30 01:27:02 UTC


README

Latest Version MIT Licensed PHP Supported Versions

花粉解决方案 事件 组件提供 PSR-14 事件分发的实现。

安装

composer require pollen-solutions/event

基本用法

简单的事件分发方式

use Pollen\Event\EventDispatcher;

// Create Dispatcher
$dispatcher = new EventDispatcher();

// Subscribe events
$dispatcher->on('event.demo', function () {
    var_dump('one');
});
$dispatcher->on('event.demo', function () {
    var_dump('two');
});

// Dispatch events
$dispatcher->trigger('event.demo');

// Output
// >> (string) 'one'
// >> (string) 'two' 

优先级事件分发

use Pollen\Event\EventDispatcher;

// Create Dispatcher
$dispatcher = new EventDispatcher();

// Subscribe events
$dispatcher->on('event.demo', function () {
    var_dump('one');
}, 10);
$dispatcher->on('event.demo', function () {
    var_dump('two');
}, 20);

// Dispatch events
$dispatcher->trigger('event.demo');

// Output
// >> (string) 'two'
// >> (string) 'one' 

可停止的事件传播

use Pollen\Event\EventDispatcher;
use Pollen\Event\StoppableEvent;

// Create Dispatcher
$dispatcher = new EventDispatcher();

// Subscribe events
$dispatcher->on('event.demo', function (StoppableEvent $e) {
    $e->stopPropagation();
    var_dump('one');
});
$dispatcher->on('event.demo', function () {
    var_dump('two');
});

// Dispatch events
$dispatcher->trigger('event.demo');

// Output
// >> (string) 'one' 

传递参数到事件监听器

use Pollen\Event\EventDispatcher;
use Pollen\Event\TriggeredEvent;

// Create Dispatcher
$dispatcher = new EventDispatcher();

// Subscribe events
$dispatcher->on('event.demo', function (TriggeredEvent $e, $arg1, $arg2) {
    var_dump('one', $arg1, $arg2);
    $e->setEventArgs(['newValue1', 'newValue2']);
});
$dispatcher->on('event.demo', function (TriggeredEvent $e, $arg1, $arg2) {
    var_dump('two', $arg1, $arg2);
});

// Dispatch events
$dispatcher->trigger('event.demo', ['value1', 'value2']);

// Output
// >> (string) 'one' 
// >> (string) 'value1'
// >> (string) 'value2'
// >> (string) 'two' 
// >> (string) 'newValue1'
// >> (string) 'newValue2'

一次分发监听器

use Pollen\Event\EventDispatcher;

// Create Dispatcher
$dispatcher = new EventDispatcher();

// Subscribe events
$dispatcher->one('event.demo', function () {
    var_dump('one');
});
$dispatcher->on('event.demo', function () {
    var_dump('two');
});

// Dispatch events
// First
$dispatcher->trigger('event.demo');
// Second
$dispatcher->trigger('event.demo');

// Output
// First dispatch
// >> (string) 'one' 
// >> (string) 'two'
// Second dispatch
// >> (string) 'two'

依赖注入容器、懒加载和可调用类

namespace {
use Pollen\Container\Container;
use Pollen\Event\EventDispatcher;

// Container Declaration 
$container = new Container();

class ServiceDemoNamedClass
{
    public function __invoke($e, $v)
    {
        var_dump('one >> '. $v);
    }
}
$container->add(
    'container.service1',
    ServiceDemoNamedClass::class
);

class ServiceDemoClosuredClass
{
    public function __invoke($e, $v)
    {
        var_dump('two >> '. $v);
    }
}
$container->add(
    'container.service2',
    function () {
       return new ServiceDemoClosuredClass();
    }
);

// Class Declaration
class InvokableDemoClass
{
    public function __invoke($e, $v)
    {
        var_dump('three >> '. $v);
    }
}

class InstantiableDemoClass
{
    public function __invoke($e, $v)
    {
        var_dump('four >> '. $v);
    }
}

// Create Dispatcher
$dispatcher = new EventDispatcher([], $container);

// Subscribe events
// Good practice
$dispatcher->on('event.demo', 'container.service1');
$dispatcher->on('event.demo', 'container.service2');
$dispatcher->on('event.demo', InvokableDemoClass::class);
// Increased memory usage practice
$dispatcher->on('event.demo', new InstantiableDemoClass());

// Dispatch events
$dispatcher->trigger('event.demo', ['value']);
}

高级用法

@todo

事件订阅者