From 4e1be0173867e99965b24cfbbdda2bab6929e78e Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Fri, 13 Oct 2023 18:42:11 +0300 Subject: [PATCH] fix `Module::setComponent()` unable to override component resolved from DI container --- CHANGELOG.md | 6 ++++++ src/base/ResolvesComponentViaDI.php | 4 ++++ tests/base/ModuleTest.php | 27 +++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9785607..5c48fe9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Yii1 Dependency Injection extension =================================== +1.0.4 Under Development +----------------------- + +- Bug: Fixed `Module::setComponent()` unable to override component resolved from DI container (klimov-paul) + + 1.0.3, August 30, 2023 ---------------------- diff --git a/src/base/ResolvesComponentViaDI.php b/src/base/ResolvesComponentViaDI.php index 6f51cf4..8b6dbd0 100644 --- a/src/base/ResolvesComponentViaDI.php +++ b/src/base/ResolvesComponentViaDI.php @@ -125,6 +125,10 @@ public function setComponent($id, $component, $merge = true): void return; } + if (isset($this->_diComponents[$id])) { + unset($this->_diComponents[$id]); + } + parent::setComponent($id, $component, $merge); } } \ No newline at end of file diff --git a/tests/base/ModuleTest.php b/tests/base/ModuleTest.php index e293193..787896d 100644 --- a/tests/base/ModuleTest.php +++ b/tests/base/ModuleTest.php @@ -121,4 +121,31 @@ public function testSetComponentByString(): void $component = $module->getComponent('cache', true); $this->assertSame($cache, $component); } + + /** + * @depends testGetComponent + */ + public function testOverrideResolvedComponent(): void + { + $container = new Container(); + $cache = new CDummyCache(); + $container->instance(ICache::class, $cache); + + DI::setContainer($container); + + $module = new Module('test', Yii::app(), [ + 'components' => [ + 'cache' => [ + 'class' => ICache::class, + ], + ], + ]); + + $resolvedComponent = $module->getComponent('cache'); + + $newComponent = new CDummyCache(); + $module->setComponent('cache', $newComponent, false); + + $this->assertSame($newComponent, $module->getComponent('cache')); + } } \ No newline at end of file