phpf / event
dev-master
2015-01-31 21:37 UTC
Requires
- php: >=5.3
This package is not auto-updated.
Last update: 2024-09-14 16:08:24 UTC
README
简单、强大且可扩展的类似 JavaScript 的事件系统,适用于 PHP。
##特性
- 简单的语法(使用
on()绑定,使用trigger()触发) - 可扩展的事件对象
- 回调函数的优先级排序
- 回调函数可以是任何可调用对象(不仅限于闭包)
- 回调函数可以传递任意数量的参数
- 阻止默认行为(使用
preventDefault()),或完全停止事件传播(使用stopPropagation()) - 一次性事件(使用
one()) - 事件取消(使用
off())
##基本用法
$events = new \Phpf\Event\Manager; $events->on('myevent', function ($event, $myarg) { if ($event->isDefaultPrevented()){ return; } echo "I'm doing my event called $myarg!"; }); $events->trigger('myevent', 'Example'); // outputs "I'm doing my event called Example!"
##示例
###优先级
默认情况下,事件以 10 的优先级添加,并且从低到高执行
$events->on('myevent', function ($event) { echo "Child"; }, 15); $events->on('myevent', function ($event) { echo "Bear"; }, 9); $events->trigger('myevent'); // outputs "BearChild"
您可以将排序顺序更改为高到低,如下所示
$events->setSortOrder(\Phpf\Event\Manager::SORT_HIGH_LOW);
###取消事件
要取消事件,只需调用 off() 方法
$events->off('myevent');
这将移除绑定到事件的任何监听器,因此如果随后触发,它们将不会调用。
###单监听器事件
您可以使用 one() 方法而不是 on() 来限制事件的执行只针对单个监听器
$events->one('myevent', function ($event) { echo "I will print."; }); $events->on('myevent', function ($event) { echo "I will not print, even though I was bound later."; }); $events->trigger('myevent'); // Prints "I will print."
###返回结果
当事件监听器执行时,将收集监听器返回的任何值;在完成(或传播停止)时,结果将作为一个索引数组返回。
例如
$events->on('myevent', function ($event) { return 'Hello'; }); $events->on('myevent', function ($event) { return 'Goodbye'; }); $results = $events->trigger('myevent'); print_r($results); // array(0 => 'Hello', 1 => 'Goodbye');
###停止传播
与 JS 类似,事件传播可以在任何时间由监听器停止。
$events->on('myevent', function ($event) { echo "This will be printed"; $event->stopPropagation(); }); $events->on('myevent', function ($event) { echo "This will not be printed."; });
$events->on('myevent', function ($event) { echo "I will not be called."; }, 12); $events->on('myevent', function ($event) { echo "I will print second."; $event->stopPropagation(); }, 11); $events->on('myevent', function ($event) { echo "I will print first."; });
###检索完成事件
完成的事件及其返回的数组被存储以供以后使用。可以使用 event() 方法检索事件对象,使用 result() 方法检索结果
$results = $events->trigger('myevent'); // ...later on, in another script: $myevent = $events->event('myevent'); $sameResults = $events->result('myevent'); // ... do stuff with event/results // re-trigger the event ! $newResults = $events->trigger($myevent);
###自定义事件对象
您还可以将 Event 类的实例传递给 trigger() 方法而不是事件 ID。这样,您可以使用自定义事件对象。
namespace MyEvents; use Phpf\Event\Event; class FilterEvent extends Event { protected $value; public function __construct($id, $initial_value) { // must call parent constructor with id if overriding parent::__construct($id); $this->value = $initial_value; } public function getValue() { return $this->value; } public function setValue($value) { $this->value = $value; } }
例如,如果您想让监听器能够修改单个返回值(一个 "过滤器"),您可以创建一个像这样的类
$events->on('myFilterEvent', function ($event) { $newval = rtrim($event->getValue(), 's') . ' objects'; $event->setValue($newval); }); $events->on('myFilterEvent', function ($event) { $event->setValue($event->getValue() . ' are cool.'); }); // Create new object with initial value "Custom events" $filterEvent = new \MyEvents\FilterEvent('myFilterEvent', 'Custom events'); $events->trigger($filterEvent); $filtered = $events->event('myFilterEvent'); echo $filtered->getValue(); // Prints "Custom event objects are cool."