sugiphp / events
观察者设计模式类似的事件系统
1.0.0
2014-12-16 13:21 UTC
Requires
- php: >=5.3
This package is not auto-updated.
Last update: 2024-09-14 14:34:46 UTC
README
观察者设计模式类似的事件系统。
安装
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);