webino / event-emitter
事件发射器实现。
Requires
- php: ~7.1
- webino/exceptions: 1.*
Requires (Dev)
- nette/tester: 1.*
- phpstan/phpstan: 0.*
- squizlabs/php_codesniffer: 3.*
- tracy/tracy: 2.*
This package is auto-updated.
Last update: 2024-09-18 14:06:18 UTC
README
事件发射器实现。
推荐用法
使用事件发射器解耦常规算法和扩展逻辑。
设置
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)
从处理程序断开事件发射器。
架构
可以有一个全局分发器来附加事件处理程序。
事件生命周期
关于事件的基本思想是,我们只需触发一个事件,所有动作都发生在处理程序中,包括主动作。然后我们可以使用优先级来监听该事件,如果我们想像一个中间件。事件传播可以在任何时候停止。
使用像 someEvent.pre 和 someEvent.post 或 someEvent.before、someEvent.after 这样的事件,不管怎样,都是混乱的,不建议这样做。给事件一个唯一的名称,然后附加处理程序,包括主动作,使用优先级。这样做的一个方便方法是使用事件 优先级常量。
开发
静态分析
composer analyse
代码风格检查
composer check
代码风格修复
composer fix
测试
composer test
Git 预提交设置
ln -s ../../pre-commit .git/hooks/pre-commit
补充说明
请,如果您对这个库感兴趣,请报告任何问题,并不要犹豫贡献。我们将感谢对这个库开发上的任何贡献。