alexpts / php-simple-events
简单的事件和过滤器
6.0.1
2023-01-05 09:51 UTC
Requires
- php: >=8.1
Requires (Dev)
- blackfire/php-sdk: ^1.31
- phpbench/phpbench: ^1.2
- phpunit/phpunit: ^9.5
README
事件发射器
它是一个非常快速的事件发射器和过滤器。
安装
$ composer require alexpts/php-simple-events
使用
创建发射器
$emitter = new \PTS\Events\EventEmitter;
添加监听器
可调用处理程序
$emitter->on('user.created', function (User $user) use ($logger) { $logger->log(sprintf("User '%s' was created.", $user->getLogin())); });
带优先级
$emitter->on('user.created', $handler, 100);
为 EventEmitterExtraArgs 实例提供额外参数(EventEmitter 实例忽略额外参数)
$emitter = new \PTS\Events\EventEmitterExtraArgs; $extra1 = 1; $extra2 = 'some'; $handler = function(string $log, int $extra1, string $extra2) { // ... }; $emitter->on('log', $handler, 50, [$extra1, $extra2]); $emitter->emit('log', ['some log']);
移除监听器
移除具体处理程序
$handler = fn() => 'log'; $emitter->on('log', $handler) $emitter->off('log', $handler);
移除所有处理程序
$emitter->off('log');
带优先级移除具体处理程序
$emitter->off('log', $handler, 100);
发射事件
简单发射
$emitter->emit('log');
在发射时传递参数
$emitter->on('log', function(string $log, int $a2, bool $a3) { // ... }); $emitter->emit('log', ['arg1', 2, true]);
接口
emit(string $name, array $args = []): self; on(string $name, callable $handler, int $priority = 50, array $extraArgs = []): self; once(string $name, callable $handler, int $priority = 50, array $extraArgs = []): self; off(string $event, callable $handler = null, int $priority = null): self; listeners(string $event = null): array; eventNames(): array;
事件处理程序
事件处理程序必须是 callable
$eventsBus = new \PTS\Events\EventEmitter; $eventsBus->on('some:event', function(){ ... }); $eventsBus->on('some:event', 'trim'); $eventsBus->on('some', ['ClassName', 'method']); $eventsBus->on('some', [$this, 'method']); $eventsBus->once('some', $instanceWithInvokeMethod);
处理程序顺序
监听器有优先级。所有监听器都按优先级调用
$events->on('post:title', 'trim', 10); // second $events->on('post:title', 'prepareTitle', 70); // first
移除处理程序
// remove handler 'trim' with priority = 10 $events->on('post:title', 'trim', 10); $events->off('post:title', 'trim', 10); // remove all handler 'trim' with any priority $events->on('post:title', 'trim', 10); $events->off('post:title', 'trim'); // remove all handlers $events->on('post:title', 'trim', 10); $events->off('post:title');
停止传播
$events->on('eventName', function() { ... }); $events->on('eventName', function() { throw new StopPropagation; }); $events->on('eventName', function() { ... }); // it does not call
过滤器
API 过滤器
过滤器与 EventEmitter 非常相似。过滤器将第一个值传递给所有监听器,并返回修改后的值。
emit(string $name, $value, array $args = []); on(string $name, callable $handler, int $priority = 50, array $extraArgs = []): self; once(string $name, callable $handler, int $priority = 50, array $extraArgs = []): self; off(string $event, callable $handler = null, int $priority = null): self; listeners(string $event = null): array; eventNames(): array;
示例
$filters = new \PTS\Events\Filters; $filters->on('post:title', 'trim'); $title = $filters->filter('post:title', ' Raw title '); // `Raw title`
注入 EventEmitter / FilterEmitter
- 事件/过滤器总线
use PTS\Events\Bus\EventBusTrait; class Service { use EventBusTrait; public function getPost() { $post = ...; // you can to modify $post via filter/event $post = $this->filter('getPost', $post); // from EventBusTrait return $post; } }
- 任何对象的事件/过滤器
从 EventEmitter 继承
use PTS\Events\Filter\FilterEmitter; use PTS\Events\EventEmitter; class Request extend FilterEmitter { // extend EventEmitter public function parseHeader() { $rawHttpRequest = '...'; $headers = $this->filter('parseHeader', $rawHttpRequest); return $headers; } } $request = new Request; $parseHeader = new ParserHeader; $request->on('parseHeader', [$parseHeader, 'parse']); $headers = $request->parseHeader();
使用 trait
use PTS\Events\Filter\FilterEmitterTrait; use PTS\Events\EventEmitterTrait; class Request use FilterEmitterTrait; public function parseHeader() { $rawHttpRequest = '...'; $headers = $this->filter('parseHeader', $rawHttpRequest); return $headers; } } $request = new Request; $parseHeader = new ParserHeader; $request->on('parseHeader', [$parseHeader, 'parse']); $headers = $request->parseHeader();