webino/event-emitter

事件发射器实现。

1.1.0 2019-06-21 18:52 UTC

This package is auto-updated.

Last update: 2024-09-18 14:06:18 UTC


README

事件发射器实现。

Build Status Coverage Status Code Quality Latest Stable Version

推荐用法

使用事件发射器解耦常规算法和扩展逻辑。

设置

PHP from Packagist

composer require webino\event-emitter

快速使用

发射事件

use Webino\EventEmitter;

$emitter = new EventEmitter;

// registering closure event handler
$emitter->on('example', function () {
    return 'Hello';
});

// emitting custom event
$event = $emitter->emit('example');

/** @var \Webino\EventResults $results */
$results = $event->getResults();

echo $results;

// => Hello

移除事件处理程序

use Webino\EventEmitter;

$emitter = new EventEmitter;

$handler = function () {
    return 'Hello';
};

$emitter->on('example', $handler);

// remove handler for all events
$emitter->off($handler);

// remove all handlers for an event
$emitter->off(null, 'example');

// remove all handlers for all events
$emitter->off();

发射事件直到

use Webino\EventEmitter;

$emitter = new EventEmitter;

$emitter->on('example', function () {
    return 'Special';
});

$event = $emitter->emit('example', function ($result) {
    // when result meets required condition
    if ('Special' === $result) {
        // stop propagation
        return false;
    }
    // or continue
    return true;
});

事件处理优先级

use Webino\EventEmitter;

$emitter = new EventEmitter;

$emitter->on('example', function () {
    return 'Begin';
}, $event::BEGIN);

$emitter->on('example', function () {
    return 'Before';
}, $event::BEFORE);

$emitter->on('example', function (Event $event) {
    return 'Main';
}, $event::MAIN);

$emitter->on('example', function () {
    return 'After';
}, $event::AFTER);

$emitter->on('example', function () {
    return 'Finish';
}, $event::FINISH);

// emitting custom event
$event = $emitter->emit('example');

/** @var \Webino\EventResults $results */
$results = $event->getResults();

echo $results;

// => BeginBeforeMainAfterFinish

事件处理程序

use Webino\EventEmitter;
use Webino\EventHandlerInterface;
use Webino\EventHandlerTrait;

class ExampleEventHandler implements EventHandlerInterface
{
    use EventHandlerTrait;

    protected function initEvents(): void
    {
        $this->on('example', function () {
            return 'Foo';
        });

        $this->on('example', function () {
            return 'Bar';
        });
    }
}

// emitting custom event
$event = $emitter->emit('example');

/** @var \Webino\EventResults $results */
$results = $event->getResults();

echo $results;

// => FooBar

API

事件

  • const BEGIN
    事件的开始优先级。

  • const BEFORE
    主事件之前的优先级。

  • const MAIN
    主事件优先级。

  • const AFTER
    主事件之后的优先级。

  • const FINISH
    事件结束时的优先级。

  • const OFFSET
    事件优先级偏移量。

  • string getName()
    获取事件名称。

  • EventEmitterInterface getTarget()
    获取事件发射源对象。

  • mixed getValue(string $name, mixed $default = null)
    通过名称获取事件值。

  • void setValues(iterable $values)
    设置事件值。

  • EventResults getResults()
    返回事件结果。

  • void stop(bool $stop = true)
    指示是否停止此事件。

  • bool isStopped()
    指示是否停止。

EventEmitter

  • void setEventDispatcher(EventDispatcherInterface $dispatcher)
    注入事件分发器。

  • void on(
    string|EventInterface|EventHandlerInterface $event,
    string|array<int, string>|callable $callback = null,
    int $priority = 1)
    设置事件处理程序。

  • void off(callable|EventHandlerInterface $callback = null, string|EventInterface $event = null)
    移除事件处理程序。

  • EventInterface emit(string|EventInterface $event, callable $until = null)
    调用处理程序。

EventResults

  • mixed|null first()
    返回第一个响应。

  • mixed|null last()
    返回最后一个响应。

EventHandler

  • void attachEventEmitter(EventDispatcherInterface $emitter)
    将事件发射器附加到处理程序。

  • void detachEventEmitter(EventDispatcherInterface $emitter)
    从处理程序断开事件发射器。

架构

可以有一个全局分发器来附加事件处理程序。

event lifecycle

事件生命周期

关于事件的基本思想是,我们只需触发一个事件,所有动作都发生在处理程序中,包括主动作。然后我们可以使用优先级来监听该事件,如果我们想像一个中间件。事件传播可以在任何时候停止。

event lifecycle

使用像 someEvent.presomeEvent.postsomeEvent.beforesomeEvent.after 这样的事件,不管怎样,都是混乱的,不建议这样做。给事件一个唯一的名称,然后附加处理程序,包括主动作,使用优先级。这样做的一个方便方法是使用事件 优先级常量

开发

Build Status Coverage Status Code Quality Latest Unstable Version

静态分析

composer analyse

代码风格检查

composer check

代码风格修复

composer fix

测试

composer test

Git 预提交设置

ln -s ../../pre-commit .git/hooks/pre-commit

补充说明

License Total Downloads GitHub code size in bytes

请,如果您对这个库感兴趣,请报告任何问题,并不要犹豫贡献。我们将感谢对这个库开发上的任何贡献。

GitHub issues GitHub forks