charm/event

一个简单的事件发射器接口和一个具有 'on', 'off' 和 'emit' 方法的特质。

1.0.0 2021-09-14 14:25 UTC

This package is auto-updated.

Last update: 2024-09-18 08:19:06 UTC


README

微观事件发射器实现。一个提供方法的事件发射器接口和特质

  • EventEmitterInterface::on( string $eventName, callable $handler )
  • EventEmitterInterface::off( string $eventName, callable $handler = ? )
  • EventEmitterInterface::emit( string $eventName, object $data, bool $cancelable=true )

为了允许“挂钩”样式功能,提供了一个 StaticEventEmitterTrait,它创建一个静态方法 StaticEventEmitterTrait::events(): EventEmitterInterface。这样,您可以在类级别(而不是每个实例)上监听事件。

通过 EventEmitterInterface::emit 处理的事件可以通过将属性 'cancelled' 设置为“真值”来取消。

完整示例

<?php
require("vendor/autoload.php");

class Example implements Charm\Event\EventEmitterInterface {
    use Charm\Event\EventEmitterTrait;

    const SAMPLE_EVENT = 'Example::SAMPLE_EVENT';

}

$instance = new Example();

// First handler
$instance->on(Example::SOME_EVENT, function($data) {
    echo "Got: ".$data->message."\n"; 
    $data->cancelled = true;
});

// Second handler won't run because the first handler set `$data->cancelled` to true
$instance->on(Example::SOME_EVENT, function($data) {
    echo "No message for me\n";
});

$instance->emit(Example::SOME_EVENT, $data = (object) [ 'message' => 'OK' ]);

最佳实践

实际上并没有多少最佳实践。您想怎么用就怎么用。我喜欢声明一个以类名和常量名命名的常量,就像示例中那样。