From 7d66342496698f7ab329e38c0a980ede851c105e Mon Sep 17 00:00:00 2001 From: Daniel Hensby Date: Thu, 11 Jan 2018 14:12:06 +0000 Subject: [PATCH] FIX Allow extension instances to be overridden by injector --- src/Core/ClassInfo.php | 1 + src/Core/Extensible.php | 32 ++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/Core/ClassInfo.php b/src/Core/ClassInfo.php index 12e707d82..3029b200f 100644 --- a/src/Core/ClassInfo.php +++ b/src/Core/ClassInfo.php @@ -208,6 +208,7 @@ class ClassInfo * eg: self::class_name('dataobJEct'); //returns 'DataObject' * * @param string|object $nameOrObject The classname or object you want to normalise + * @throws \ReflectionException * @return string The normalised class name */ public static function class_name($nameOrObject) diff --git a/src/Core/Extensible.php b/src/Core/Extensible.php index e4bb1be1b..8dc523bf5 100644 --- a/src/Core/Extensible.php +++ b/src/Core/Extensible.php @@ -495,17 +495,22 @@ trait Extensible /** * Get an extension instance attached to this object by name. * - * @uses hasExtension() - * * @param string $extension - * @return Extension + * @return Extension|null */ public function getExtensionInstance($extension) { $instances = $this->getExtensionInstances(); - return isset($instances[$extension]) - ? $instances[$extension] - : null; + if (array_key_exists($extension, $instances)) { + return $instances[$extension]; + } + // in case Injector has been used to replace an extension + foreach ($instances as $instance) { + if (is_a($instance, $extension)) { + return $instance; + } + } + return null; } /** @@ -524,8 +529,7 @@ trait Extensible */ public function hasExtension($extension) { - $instances = $this->getExtensionInstances(); - return isset($instances[$extension]); + return (bool) $this->getExtensionInstance($extension); } /** @@ -553,8 +557,16 @@ trait Extensible if ($extensions) { foreach ($extensions as $extension) { - $instance = Injector::inst()->get($extension); - $this->extension_instances[get_class($instance)] = $instance; + $name = $extension; + // Allow service names of the form "%$ServiceName" + if (substr($name, 0, 2) == '%$') { + $name = substr($name, 2); + } + $name = trim(strtok($name, '(')); + if (class_exists($name)) { + $name = ClassInfo::class_name($name); + } + $this->extension_instances[$name] = Injector::inst()->get($extension); } } }