phpf/event

Phpf 事件包

dev-master 2015-01-31 21:37 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:08:24 UTC


README

简单、强大且可扩展的类似 JavaScript 的事件系统,适用于 PHP。

  1. 特性
  2. 基本用法
  3. 示例

##特性

  • 简单的语法(使用 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."