ikkez / f3-events
PHP Fat-Free 框架的甜事件系统
v1.0.3
2021-11-06 19:53 UTC
Requires
- bcosca/fatfree-core: 3.*
This package is auto-updated.
Last update: 2024-09-07 02:03:29 UTC
README
这是一个PHP Fat-free框架的事件系统。以下是目前的包括内容:
- 从应用中的任何位置发出事件
- 将一个或多个监听器附加到事件
- 监听器(钩子)可以有优先级顺序
- 监听器的附加选项
- 特定对象的本地事件
- 与事件一起发送负载和上下文数据
- 子事件和事件传播
- 停止事件链
- 与F3 v3.5和PHP v7.2+兼容
此事件系统是 实验性的,因此请谨慎处理。
安装
-
方法1:使用composer:
composer require ikkez/f3-events
-
方法2:将
lib/event.php
文件复制到您的F3lib/
目录或其他已知于自动加载器的目录
它是如何工作的
Event类是Prefab的子类,因此您可以通过这种方式在任何地方获取它:
// fetch the global Event instance $events = \Sugar\Event::instance();
定义监听器/钩子
// typical F3 callstring $events->on('user_login', 'Notification->user_login'); // or with callbacks $events->on('user_login', function(){ // ... }); // or with callables $events->on('user_login', [$this,'method']);
发送事件
$events->emit('user_login');
与事件一起发送负载
$events->on('user_login', function($username){ \Logger::log($username.' logged in'); }); $events->emit('user_login', 'freakazoid');
具有优先级的多个监听器
$events->on('user_login', function($username){ \Logger::log($username.' logged in'); }, 10); // 10 is default priority $events->on('user_login', function(){ \Flash::addMessage('You have logged in successfully'); }, 20); // 20 is a higher priority and is called first $events->emit('user_login', 'freakazoid');
停止事件链
$events->on('user_login', function($username){ \Logger::log($username.' logged in'); }); $events->on('user_login', function(){ \Flash::addMessage('You have logged in successfully'); return false; // <-- skip any other listener on the same event }, 20); $events->emit('user_login', 'freakazoid'); // The logger event isn't called anymore
附加事件上下文数据
$events->on('user_login', function($username,$context){ if ($context['lang'] == 'en') \Flash::addMessage('You have logged in successfully'); elseif($context['lang'] == 'de') \Flash::addMessage('Du hast dich erfolgreich angemeldet'); }); $events->emit('user_login', 'freakazoid', array('lang'=>'en'));
附加监听器选项
$events->on('user_login', function($username,$context,$event){ \Flash::addMessage('You have logged in successfully', $event['options']['type']); }, 20, array('type'=>'success'));
我认为这些是适合大多数情况的示例。尽管如此,这里还有一些您可以进行的高级操作:
过滤负载
$events->on('get_total', function($basket){ $sum = 0; foreach($basket as $prod) { $sum+=$prod; } return $sum; }); $products = array( 'a' => 2, 'b' => 8, 'c' => 15, ); $sum = $events->emit('get_total',$products); echo $sum; // 25
添加子事件。这些事件在父事件之后调用。监听器和子事件遵循先进先出(FIFO)处理,这意味着首先注册的是首先调用的。
$events->on('get_total.tax', function($sum){ return $sum+($sum*0.2); }); $events->on('get_total.shipping', function($sum){ return $sum+5; }); $sum = $events->emit('get_total',$products); echo $sum; // 35
移除钩子
$events->off('get_total.tax'); $sum = $events->emit('get_total',$products); echo $sum; // 30
还有一个内置的机制,它支持为实现了它的映射器等本地事件,
$user = new \Model\User(); $events->watch($user)->on('update.email','\Mailer->sendEmailActivationLink');
单元测试
要将测试添加到您的本地F3测试基准,请添加以下内容:
// Event Tests $f3->concat('AUTOLOAD', ',path/to/f3-events/test/'); \Sugar\EventTests::init();
许可
您可以在GNU通用公共许可证版本3或更高版本的条款下使用此插件。
版权(C)2017 Christian Knuth [ikkez]