sugiphp/events

观察者设计模式类似的事件系统

1.0.0 2014-12-16 13:21 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:34:46 UTC


README

Build Status

观察者设计模式类似的事件系统。

安装

composer require sugiphp/events ~1.0

用法

事件

事件是一个简单的对象,通过其唯一名称标识。当一个事件被触发时,事件分发器会通知注册了该特定事件名称的所有监听器。

监听器

任何不需要超过一个参数的函数或方法都可以作为监听器。当一个事件被触发时,分发器会依次调用所有注册的监听器(函数)。

分发器

分发器在事件系统中扮演着最重要的角色。所有事件都是通过分发器触发的。分发器会检查注册了该事件的所有监听器,并向它们发送通知。

// create a dispatcher
$dispatcher = new Dispatcher();
// register one or more listeners for one or more events
$dispatcher->addListener("user.login", function ($event) {
    // this function will be executed when an event with name "user.login" is fired
});

// fires an event
$dispatcher->dispatch(new Event("user.login"));

传递数据

所有监听器应该只有一个参数 - 事件。如果我们需要将这些函数传递额外的信息,我们可以通过事件传递这些数据。

$dispatcher->addListener("user.login", function ($event) {
    // get one property
    echo $event->getParam("id"); // 1
    // get a property as Array
    echo $event["username"]; // "demo"
    // fetch all data
    $event->getParams(); // array("id" => 1, "username" => "demo")
});
$event = new Event("user.login", array("id" => 1, "username" => "demo"));
$dispatcher->dispatch($event);

您可能需要在监听器之间交换数据。您可以通过使用 setParam() 方法在事件中添加和修改数据来实现这一点。

$dispatcher->addListener("user.login", function ($event) {
    if ("mike" == $event["username"]) {
        // array access
        $event["is_admin"] = true;
    } else {
        // using setParam() method
        $event->setParam("is_admin", false);
    }
});

$dispatcher->addListener("user.login", function ($event) {
    if ($event["is_admin"]) {
        echo "Hello Admin";
    }
});

$event = new Event("user.login", array("username" => "mike"));
$dispatcher->dispatch($event);