smoren / event-based-inheritance-model
基于事件的继承模型
1.0.3
2020-01-03 22:11 UTC
Requires
- php: >=7.2.0
- ext-json: *
This package is auto-updated.
Last update: 2024-09-16 22:32:40 UTC
README
实现了以下事件模型:
- 对于每个事件,可以添加无限数量的处理器,这些处理器被放入该事件的堆栈中;
- 当事件被初始化时,只会启动堆栈顶部的处理器,但它可以访问上一个处理器,并在需要时启动它。
因此实现了“链式继承”模型,即每个后续处理器可以启动前面的处理器并执行自己的操作,这两个动作可以按任何顺序执行。
安装
composer require smoren/event-based-inheritance-model
工作原理演示
<?php use Smoren\EventBasedInheritanceModel\EventBus; use Smoren\EventBasedInheritanceModel\Listener; // создаем шину $bus = new EventBus([ // вводим событие onTest и назначаем на него обработчик 'onTest' => function(&$params, Listener $listener) { $params['a']++; echo "onTest (0): ".json_encode($params)."\n"; }, ]); // добавляем в стек обработчиков события onTest еще один обработчик $bus->addListener('onTest', function(&$params, Listener $listener) { $listener->handlePrevious($params); // в начале своего исполнения он запускает предыдущий $params['a']++; echo "onTest (1): ".json_encode($params)."\n"; }); // добавляем в стек обработчиков события onTest еще один обработчик $bus->addListener('onTest', function(&$params, Listener $listener) { $listener->handlePrevious($params); // в начале своего исполнения он запускает предыдущий $params['a']++; echo "onTest (2): ".json_encode($params)."\n"; return array_merge($params, ['b' => 0]); }); // вводим событие onTest1 и назначаем на него обработчик $bus->addListener('onMyTest', function(&$params, Listener $listener) { // в начале своего исполнения он запускает предыдущий, но предыдущего нет, поэтому строка не имеет смысла $listener->handlePrevious($params); $params->a++; echo "onMyTest (0): ".json_encode($params)."\n"; }); // добавляем в стек обработчиков события onTest1 еще один обработчик $bus->addListener('onMyTest', function(&$params, Listener $listener) { $listener->handlePrevious($params); $params->a++; echo "onMyTest (1): ".json_encode($params)."\n"; return $params; }); // инициируем событие onTest $params = ['a' => 1]; $result = $bus->trigger('onTest', $params); print_r($result); // в результате получим то, что вернет верхний в стеке обработчик /* onTest (0): {"a":2} onTest (1): {"a":3} onTest (2): {"a":4} Array ( [a] => 4 [b] => 0 ) */ echo "\n"; // инициируем событие onMyTest $params = new \stdClass(); $params->a = 1; $result = $bus->trigger('onMyTest', $params); print_r($result); // в результате получим то, что вернет верхний в стеке обработчик /* onMyTest (0): {"a":2} onMyTest (1): {"a":3} stdClass Object ( [a] => 3 ) */