Browse Source

Fixed `Component::off()` not to throw an exception

Fixes #15822
tags/2.0.14.2
SilverFire - Dmitry Naumenko 7 years ago
parent
commit
08c87aec4f
No known key found for this signature in database
GPG Key ID: 39DD917A92B270A
  1. 1
      framework/CHANGELOG.md
  2. 25
      framework/base/Component.php
  3. 9
      tests/framework/base/ComponentTest.php

1
framework/CHANGELOG.md

@ -6,6 +6,7 @@ Yii Framework 2 Change Log
- Bug #15801: Fixed `has-error` CSS class assignment in `yii\widgets\ActiveField` when attribute name is prefixed with tabular index (FabrizioCaldarelli)
- Bug #15792: Added missing `yii\db\QueryBuilder::conditionClasses` setter (silverfire)
- Bug #15822: Fixed `yii\base\Component::off()` not to throw an exception when handler does not exist (silverfire)
2.0.14.1 February 24, 2018

25
framework/base/Component.php

@ -556,9 +556,9 @@ class Component extends BaseObject
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
$removed = false;
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
@ -572,18 +572,19 @@ class Component extends BaseObject
}
// wildcard event names
$removed = false;
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}

9
tests/framework/base/ComponentTest.php

@ -436,6 +436,15 @@ class ComponentTest extends TestCase
$this->assertFalse($this->component->hasEventHandlers('foo'));
$this->assertFalse($this->component->off('foo'));
}
public function testDetachNotAttachedHandler()
{
$obj = new NewComponent();
$obj->on('test', [$this, 'handler']);
$this->assertFalse($obj->off('test', [$this, 'handler2']), 'Trying to remove the handler that is not attached');
$this->assertTrue($obj->off('test', [$this, 'handler']), 'Trying to remove the attached handler');
}
}
class NewComponent extends Component

Loading…
Cancel
Save