ikkez/f3-events

PHP Fat-Free 框架的甜事件系统

v1.0.3 2021-11-06 19:53 UTC

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 文件复制到您的F3 lib/ 目录或其他已知于自动加载器的目录

它是如何工作的

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]