From de7c19c456bf944e61c9e32835097727cd5d79ef Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 2 Apr 2022 14:02:14 +0900 Subject: [PATCH 1/8] test: fix assertions If we use Compoesr autoloader, the path would be like `/vendor/composer/../../app/Controllers/Home.php`. --- tests/system/Autoloader/AutoloaderTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/system/Autoloader/AutoloaderTest.php b/tests/system/Autoloader/AutoloaderTest.php index f9a56cae82db..82e0307affad 100644 --- a/tests/system/Autoloader/AutoloaderTest.php +++ b/tests/system/Autoloader/AutoloaderTest.php @@ -88,7 +88,7 @@ public function testServiceAutoLoaderFromShareInstances() // look for Home controller, as that should be in base repo $actual = $autoloader->loadClass('App\Controllers\Home'); $expected = APPPATH . 'Controllers' . DIRECTORY_SEPARATOR . 'Home.php'; - $this->assertSame($expected, $actual); + $this->assertSame($expected, realpath($actual) ?: $actual); } public function testServiceAutoLoader() @@ -99,7 +99,7 @@ public function testServiceAutoLoader() // look for Home controller, as that should be in base repo $actual = $autoloader->loadClass('App\Controllers\Home'); $expected = APPPATH . 'Controllers' . DIRECTORY_SEPARATOR . 'Home.php'; - $this->assertSame($expected, $actual); + $this->assertSame($expected, realpath($actual) ?: $actual); } public function testExistingFile() From 46b3de8aef4d74600235693a09a9052c476df731 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 2 Apr 2022 14:07:33 +0900 Subject: [PATCH 2/8] refactor: extract method --- system/Autoloader/Autoloader.php | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index bfd535f856ca..7423fc235586 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -106,7 +106,8 @@ public function initialize(Autoload $config, Modules $modules) // Should we load through Composer's namespaces, also? if ($modules->discoverInComposer) { - $this->discoverComposerNamespaces(); + $this->loadComposerClassmap(); + $this->loadComposerNamespaces(); } return $this; @@ -296,10 +297,7 @@ public function sanitizeFilename(string $filename): string return trim($filename, '.-_'); } - /** - * Locates autoload information from Composer, if available. - */ - protected function discoverComposerNamespaces() + protected function loadComposerNamespaces() { if (! is_file(COMPOSER_PATH)) { return; @@ -310,7 +308,6 @@ protected function discoverComposerNamespaces() */ $composer = include COMPOSER_PATH; $paths = $composer->getPrefixesPsr4(); - $classes = $composer->getClassMap(); unset($composer); @@ -327,6 +324,23 @@ protected function discoverComposerNamespaces() } $this->prefixes = array_merge($this->prefixes, $newPaths); + } + + protected function loadComposerClassmap(): void + { + if (! is_file(COMPOSER_PATH)) { + return; + } + + /** + * @var ClassLoader $composer + */ + $composer = include COMPOSER_PATH; + + $classes = $composer->getClassMap(); + + unset($composer); + $this->classmap = array_merge($this->classmap, $classes); } } From ceb9418bd5ea051fd0a71fb916cb90a399bb0bda Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 2 Apr 2022 14:17:41 +0900 Subject: [PATCH 3/8] refactor: move duplicated logic up --- system/Autoloader/Autoloader.php | 44 ++++++++++++-------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index 7423fc235586..88f3dd743470 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -104,10 +104,19 @@ public function initialize(Autoload $config, Modules $modules) $this->files = $config->files; } - // Should we load through Composer's namespaces, also? - if ($modules->discoverInComposer) { - $this->loadComposerClassmap(); - $this->loadComposerNamespaces(); + if (is_file(COMPOSER_PATH)) { + /** + * @var ClassLoader $composer + */ + $composer = include COMPOSER_PATH; + + // Should we load through Composer's namespaces, also? + if ($modules->discoverInComposer) { + $this->loadComposerClassmap($composer); + $this->loadComposerNamespaces($composer); + } + + unset($composer); } return $this; @@ -297,19 +306,9 @@ public function sanitizeFilename(string $filename): string return trim($filename, '.-_'); } - protected function loadComposerNamespaces() + protected function loadComposerNamespaces(ClassLoader $composer): void { - if (! is_file(COMPOSER_PATH)) { - return; - } - - /** - * @var ClassLoader $composer - */ - $composer = include COMPOSER_PATH; - $paths = $composer->getPrefixesPsr4(); - - unset($composer); + $paths = $composer->getPrefixesPsr4(); // Get rid of CodeIgniter so we don't have duplicates if (isset($paths['CodeIgniter\\'])) { @@ -326,21 +325,10 @@ protected function loadComposerNamespaces() $this->prefixes = array_merge($this->prefixes, $newPaths); } - protected function loadComposerClassmap(): void + protected function loadComposerClassmap(ClassLoader $composer): void { - if (! is_file(COMPOSER_PATH)) { - return; - } - - /** - * @var ClassLoader $composer - */ - $composer = include COMPOSER_PATH; - $classes = $composer->getClassMap(); - unset($composer); - $this->classmap = array_merge($this->classmap, $classes); } } From 954b647ddd7ac3df8f455a44b4cbfa13f6f68194 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 2 Apr 2022 14:18:22 +0900 Subject: [PATCH 4/8] fix: don't load Composer classmap if $discoverInComposer is false Now it always loads and uses Composer classmap if it is available. --- system/Autoloader/Autoloader.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index 88f3dd743470..f4c37b4d250e 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -110,9 +110,10 @@ public function initialize(Autoload $config, Modules $modules) */ $composer = include COMPOSER_PATH; + $this->loadComposerClassmap($composer); + // Should we load through Composer's namespaces, also? if ($modules->discoverInComposer) { - $this->loadComposerClassmap($composer); $this->loadComposerNamespaces($composer); } From 783835efddd6c383de74c42402380c95903f88f5 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sat, 2 Apr 2022 14:20:09 +0900 Subject: [PATCH 5/8] refactor: extract method --- system/Autoloader/Autoloader.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index f4c37b4d250e..cca4a7d28f1e 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -105,22 +105,27 @@ public function initialize(Autoload $config, Modules $modules) } if (is_file(COMPOSER_PATH)) { - /** - * @var ClassLoader $composer - */ - $composer = include COMPOSER_PATH; + $this->loadComposerInfo($modules); + } - $this->loadComposerClassmap($composer); + return $this; + } - // Should we load through Composer's namespaces, also? - if ($modules->discoverInComposer) { - $this->loadComposerNamespaces($composer); - } + protected function loadComposerInfo(Modules $modules): void + { + /** + * @var ClassLoader $composer + */ + $composer = include COMPOSER_PATH; + + $this->loadComposerClassmap($composer); - unset($composer); + // Should we load through Composer's namespaces, also? + if ($modules->discoverInComposer) { + $this->loadComposerNamespaces($composer); } - return $this; + unset($composer); } /** From c179ed044558faa93d7ad05869b1e4c9b22069ca Mon Sep 17 00:00:00 2001 From: kenjis Date: Sun, 3 Apr 2022 08:01:39 +0900 Subject: [PATCH 6/8] refactor: restore discoverComposerNamespaces() and deprecate --- system/Autoloader/Autoloader.php | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index cca4a7d28f1e..7152f160c652 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -337,4 +337,40 @@ protected function loadComposerClassmap(ClassLoader $composer): void $this->classmap = array_merge($this->classmap, $classes); } + + /** + * Locates autoload information from Composer, if available. + * + * @deprecated No longer used. + */ + protected function discoverComposerNamespaces() + { + if (! is_file(COMPOSER_PATH)) { + return; + } + + /** + * @var ClassLoader $composer + */ + $composer = include COMPOSER_PATH; + $paths = $composer->getPrefixesPsr4(); + $classes = $composer->getClassMap(); + + unset($composer); + + // Get rid of CodeIgniter so we don't have duplicates + if (isset($paths['CodeIgniter\\'])) { + unset($paths['CodeIgniter\\']); + } + + $newPaths = []; + + foreach ($paths as $key => $value) { + // Composer stores namespaces with trailing slash. We don't. + $newPaths[rtrim($key, '\\ ')] = $value; + } + + $this->prefixes = array_merge($this->prefixes, $newPaths); + $this->classmap = array_merge($this->classmap, $classes); + } } From 577eefe25c4061e0a286b51969fc96ad177282b3 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sun, 3 Apr 2022 08:03:15 +0900 Subject: [PATCH 7/8] refactor: make new methods private --- system/Autoloader/Autoloader.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index 7152f160c652..520e669be685 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -111,7 +111,7 @@ public function initialize(Autoload $config, Modules $modules) return $this; } - protected function loadComposerInfo(Modules $modules): void + private function loadComposerInfo(Modules $modules): void { /** * @var ClassLoader $composer @@ -312,7 +312,7 @@ public function sanitizeFilename(string $filename): string return trim($filename, '.-_'); } - protected function loadComposerNamespaces(ClassLoader $composer): void + private function loadComposerNamespaces(ClassLoader $composer): void { $paths = $composer->getPrefixesPsr4(); @@ -331,7 +331,7 @@ protected function loadComposerNamespaces(ClassLoader $composer): void $this->prefixes = array_merge($this->prefixes, $newPaths); } - protected function loadComposerClassmap(ClassLoader $composer): void + private function loadComposerClassmap(ClassLoader $composer): void { $classes = $composer->getClassMap(); From c7e659fc367eefd76cb0680214880fb14eaa4585 Mon Sep 17 00:00:00 2001 From: kenjis Date: Sun, 3 Apr 2022 08:13:44 +0900 Subject: [PATCH 8/8] docs: add changelog --- user_guide_src/source/changelogs/v4.2.0.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user_guide_src/source/changelogs/v4.2.0.rst b/user_guide_src/source/changelogs/v4.2.0.rst index 465054262b41..99f980d6b35e 100644 --- a/user_guide_src/source/changelogs/v4.2.0.rst +++ b/user_guide_src/source/changelogs/v4.2.0.rst @@ -17,6 +17,7 @@ BREAKING - ``public/index.php`` - ``spark`` - The method signature of ``CodeIgniter\CLI\CommandRunner::_remap()`` has been changed to fix a bug. +- The ``CodeIgniter\Autoloader\Autoloader::initialize()`` has changed the behavior to fix a bug. It used to use Composer classmap only when ``$modules->discoverInComposer`` is true. Now it always uses the Composer classmap if Composer is available. Enhancements ************ @@ -55,6 +56,7 @@ Deprecations - ``CodeIgniter\Log\Logger::cleanFilenames()`` and ``CodeIgniter\Test\TestLogger::cleanup()`` are both deprecated. Use the ``clean_path()`` function instead. - ``CodeIgniter\Router\Router::setDefaultController()`` is deprecated. - The constant ``SPARKED`` in **spark** is deprecated. Use the ``$context`` property in ``CodeIgniter\CodeIgniter`` instead. +- ``CodeIgniter\Autoloader\Autoloader::discoverComposerNamespaces()`` is deprecated, and no longer used. Bugs Fixed **********