From cccb65a70dc012f3e212d25d0c7f58bf024b33f7 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 23 Dec 2021 14:35:50 +0300 Subject: [PATCH] Fix #19108: Optimize `Component::hasEventHandlers()` and `Component::trigger()` --- framework/CHANGELOG.md | 1 + framework/base/Component.php | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 95d3cbe..a0fbafc 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -35,6 +35,7 @@ Yii Framework 2 Change Log - Bug #19031: Fix displaying console help for parameters with declared types (WinterSilence) - Bug #19030: Add DI container usage to `yii\base\Widget::end()` (papppeter) - Bug #19096: Fix `Request::getIsConsoleRequest()` may return erroneously when testing a Web application in Codeception (WinterSilence) +- Enh #19108: Optimize `Component::hasEventHandlers()` and `Component::trigger()` (WinterSilence) 2.0.43 August 09, 2021 diff --git a/framework/base/Component.php b/framework/base/Component.php index 32f714c..bd09925 100644 --- a/framework/base/Component.php +++ b/framework/base/Component.php @@ -465,13 +465,17 @@ class Component extends BaseObject { $this->ensureBehaviors(); + if (!empty($this->_events[$name])) { + return true; + } + foreach ($this->_eventWildcards as $wildcard => $handlers) { if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) { return true; } } - return !empty($this->_events[$name]) || Event::hasHandlers($this, $name); + return Event::hasHandlers($this, $name); } /** @@ -594,10 +598,12 @@ class Component extends BaseObject /** * Triggers an event. - * This method represents the happening of an event. It invokes - * all attached handlers for the event including class-level handlers. + * + * This method represents the happening of an event. It invokes all attached handlers for the event + * including class-level handlers. + * * @param string $name the event name - * @param Event $event the event parameter. If not set, a default [[Event]] object will be created. + * @param Event|null $event the event instance. If not set, a default [[Event]] object will be created. */ public function trigger($name, Event $event = null) { @@ -606,15 +612,15 @@ class Component extends BaseObject $eventHandlers = []; foreach ($this->_eventWildcards as $wildcard => $handlers) { if (StringHelper::matchWildcard($wildcard, $name)) { - $eventHandlers = array_merge($eventHandlers, $handlers); + $eventHandlers[] = $handlers; } } - if (!empty($this->_events[$name])) { - $eventHandlers = array_merge($eventHandlers, $this->_events[$name]); + $eventHandlers[] = $this->_events[$name]; } if (!empty($eventHandlers)) { + $eventHandlers = call_user_func_array('array_merge', $eventHandlers); if ($event === null) { $event = new Event(); }