ifcanduela/events

小巧简单的事件库

1.0.0 2019-09-30 06:05 UTC

This package is auto-updated.

Last update: 2024-09-29 05:22:07 UTC


README

任何类型项目的简单即插即用事件库。

安装

使用 Composer

composer require ifcanduela/events

用法

\ifcanduela\events\CanEmitEvents\ifcanduela\events\CanListenToEvents 特性混入你的类中,并调用 emit()listenTo() 方法。

发射事件

一个对象可以使用 CanEmitEvents 特性和它的 emit() 方法来发射事件。

一个 事件 可能是一个简单的 string,或者是一个除 stdClass 之外的类的对象。如果事件是一个 string,则可以提供一个可选的 $payload,并将其发送到监听器而不是事件字符串。

class MyEventType
{
    public $someProperty;

    public function __construct(int $data)
    {
        $this->someProperty = $data;
    }
}

class MyEventEmitter
{
    use \ifcanduela\events\CanEmitEvents;

    public function createData()
    {
        $data = random_int();

        // using an object as event
        $this->emit(new MyEventType($data));

        // using a string as event name; the array will be sent to the listener
        $this->emit("data.created", ["data" => $data]);
    }
}

监听事件

一个对象可以使用 CanListenToEvents 特性和调用 listenTo() 来监听事件。

事件回调将接收事件的有效负载,如果有的话。对于事件对象,$payload 将是事件对象本身,否则它将是发射器传递的任何有效负载。

class MyEventListener
{
    public function __construct()
    {
        $this->listenTo(MyEventType::class, function ($event) {
            echo $event->someProperty;
        });

        $this->listenTo("data.created", function ($payload) {
            echo $payload["data"];
        });

        $this->listenTo("data.created", [$this, "eventHandler"]);
    }

    public function eventHandler($payload)
    {
        echo $payload["data"];
    }
}

直接使用 EventManager

事件管理器允许你的代码从外部对象发射和监听事件。将 $object->emit() 替换为 EventManager::trigger(),将 $object->listenTo() 替换为 EventManager::register()。这两个静态方法由特性在幕后使用,所以功能完全相同。

EventManager::register("event.name", function ($payload) {
    assert($payload["a"] === 1);
    assert($payload["b"] === 2);
});

EventManager::trigger("event.name", ["a" => 1, "b" => 2]);

许可证

MIT.