jbzoo/event

基于事件的开发库

7.0.1 2024-01-28 08:57 UTC

README

CI Coverage Status Psalm Coverage Psalm Level CodeFactor
Stable Version Total Downloads Dependents GitHub License

事件发射器是一个简单的模式,允许你创建一个可以发出事件的对象,并允许你监听这些事件。

安装

composer require jbzoo/event

简单示例

use JBZoo\Event\EventManager;

$eManager = new EventManager();

// Simple
$eManager->on('create', function () {
    echo "Something action";
});

// Just do it!
$eManager->trigger('create');

设置优先级

通过提供优先级,你可以确保订阅者按照特定的顺序处理。默认优先级是 EventManager::MID。低于该优先级的将先触发,高于该优先级的将后触发。如果有两个具有相同优先级的订阅者,它们将执行在一个未定义但确定的顺序中。

// Run it first
$eManager->on('create', function () {
    echo "Something high priority action";
}, EventManager::HIGH);

// Run it latest
$eManager->on('create', function () {
    echo "Something another action";
}, EventManager::LOW);

// Custom index
$eManager->on('create', function () {
    echo "Something action";
}, 42);

// Don't care...
$eManager->on('create', function () {
    echo "Something action";
});

回调类型

支持所有默认的PHP回调,因此不需要闭包。

$eManager->on('create', function(){ /* ... */ }); // Custom function
$eManager->on('create', 'myFunction');            // Custom function name
$eManager->on('create', ['myClass', 'myMethod']); // Static function
$eManager->on('create', [$object, 'Method']);     // Method of instance

取消事件队列

use JBZoo\Event\ExceptionStop;

$eManager->on('create', function () {
    throw new ExceptionStop('Some reason'); // Special exception for JBZoo/Event
});

$eManager->trigger('create'); // return 'Some reason' or TRUE if all events done

传递参数

参数可以以数组的形式传递。

$eManager->on('create', function ($entityId) {
    echo "An entity with id ", $entityId, " just got created.\n";
});
$entityId = 5;
$eManager->trigger('create', [$entityId]);

因为监听器的返回值实际上无法进行任何操作,所以你可以通过引用传递参数,以便在监听器之间以及监听器与发射器之间进行通信。

$eManager->on('create', function ($entityId, &$warnings) {
    echo "An entity with id ", $entityId, " just got created.\n";
    $warnings[] = "Something bad may or may not have happened.\n";
});
$warnings = [];
$eManager->trigger('create', [$entityId, &$warnings]);

命名空间

$eManager->on('item.*', function () {
    // item.init
    // item.save
    echo "Any actions with item";
});

$eManager->on('*.init', function () {
    // tag.init
    // item.init
    echo "Init any entity";
});

$eManager->on('*.save', function () {
    // tag.save
    // item.save
    echo "Saving any entity in system";
});

$eManager->on('*.save.after', function () {
    // tag.save.after
    // item.save.after
    echo "Any entity on after save";
});

$eManager->trigger('tag.init');
$eManager->trigger('tag.save.before');
$eManager->trigger('tag.save');
$eManager->trigger('tag.save.after');

$eManager->trigger('item.init');
$eManager->trigger('item.save.before');
$eManager->trigger('item.save');
$eManager->trigger('item.save.after');

PHP v7.4的基准测试信息总结(执行时间)

所有基准测试都在没有xdebug的情况下执行,并使用一个大型的随机数组和100,000次迭代。

基准测试基于工具 phpbench/phpbench。详细信息请见 此处

请注意 - 1μs = 1/1,000,000 秒!

基准测试: ManyCallbacks

基准测试: ManyCallbacksWithPriority

基准测试: OneCallback

基准测试: Random

单元测试和代码风格检查

make update
make test-all

许可证

MIT