From 6bcf5cb82328441c4543b898005b88fb5ff9cf3a Mon Sep 17 00:00:00 2001 From: Philipp Date: Sat, 29 Jul 2023 13:20:02 +0200 Subject: [PATCH] Make InstanceManager strategy naming convention case insensitive. --- src/Core/Hooks/Model/DiceInstanceManager.php | 8 ++++---- .../Core/Hooks/Model/InstanceManagerTest.php | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Core/Hooks/Model/DiceInstanceManager.php b/src/Core/Hooks/Model/DiceInstanceManager.php index 194fc6e5c7..07ea729794 100644 --- a/src/Core/Hooks/Model/DiceInstanceManager.php +++ b/src/Core/Hooks/Model/DiceInstanceManager.php @@ -49,11 +49,11 @@ class DiceInstanceManager implements ICanCreateInstances, ICanRegisterStrategies /** {@inheritDoc} */ public function registerStrategy(string $interface, string $class, ?string $name = null): ICanRegisterStrategies { - if (!empty($this->instance[$interface][$name])) { + if (!empty($this->instance[$interface][strtolower($name)])) { throw new HookRegisterArgumentException(sprintf('A class with the name %s is already set for the interface %s', $name, $interface)); } - $this->instance[$interface][$name] = $class; + $this->instance[$interface][strtolower($name)] = $class; return $this; } @@ -61,10 +61,10 @@ class DiceInstanceManager implements ICanCreateInstances, ICanRegisterStrategies /** {@inheritDoc} */ public function create(string $class, string $strategy, array $arguments = []): object { - if (empty($this->instance[$class][$strategy])) { + if (empty($this->instance[$class][strtolower($strategy)])) { throw new HookInstanceException(sprintf('The class with the name %s isn\'t registered for the class or interface %s', $strategy, $class)); } - return $this->dice->create($this->instance[$class][$strategy], $arguments); + return $this->dice->create($this->instance[$class][strtolower($strategy)], $arguments); } } diff --git a/tests/src/Core/Hooks/Model/InstanceManagerTest.php b/tests/src/Core/Hooks/Model/InstanceManagerTest.php index 44459eb2ee..c9746d26a0 100644 --- a/tests/src/Core/Hooks/Model/InstanceManagerTest.php +++ b/tests/src/Core/Hooks/Model/InstanceManagerTest.php @@ -235,4 +235,23 @@ class InstanceManagerTest extends MockedTest self::assertEquals($cBool, $getInstanceA->getCBool()); self::assertEquals($cBool, $getInstanceB->getCBool()); } + + /** + * @see https://github.com/friendica/friendica/issues/13318 + */ + public function testCaseInsensitiveNames() + { + $instance = new DiceInstanceManager(new Dice(), $this->hookFileManager); + + $instance->registerStrategy(IAmADecoratedInterface::class, FakeInstance::class, 'fake'); + + // CamelCase + self::assertInstanceOf(FakeInstance::class, $instance->create(IAmADecoratedInterface::class, 'Fake')); + // UPPER CASE + self::assertInstanceOf(FakeInstance::class, $instance->create(IAmADecoratedInterface::class, 'FAKE')); + // lower case + self::assertInstanceOf(FakeInstance::class, $instance->create(IAmADecoratedInterface::class, 'fake')); + // UnKnOwN + self::assertInstanceOf(FakeInstance::class, $instance->create(IAmADecoratedInterface::class, 'fAkE')); + } }