diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php index 4666149f27e9..1d28cfc4c018 100644 --- a/system/Autoloader/Autoloader.php +++ b/system/Autoloader/Autoloader.php @@ -418,7 +418,9 @@ private function loadComposerNamespaces(ClassLoader $composer, array $composerPa $packageList = []; foreach ($allData as $list) { - $packageList = array_merge($packageList, $list['versions']); + foreach ($list['versions'] as $packageName => $data) { + $packageList[$packageName] = $data; + } } // Check config for $composerPackages. diff --git a/tests/system/Autoloader/AutoloaderTest.php b/tests/system/Autoloader/AutoloaderTest.php index be22e4a403f1..8e1d81cd1c14 100644 --- a/tests/system/Autoloader/AutoloaderTest.php +++ b/tests/system/Autoloader/AutoloaderTest.php @@ -20,6 +20,7 @@ use CodeIgniter\Exceptions\RuntimeException; use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\ReflectionHelper; +use Composer\Autoload\ClassLoader; use Config\Autoload; use Config\Modules; use PHPUnit\Framework\Attributes\Group; @@ -417,6 +418,22 @@ public function testFindsComposerRoutesWithComposerPathNotFound(): void $this->assertArrayNotHasKey('Laminas\\Escaper', $namespaces); } + public function testLoadComposerNamespacesAccumulatesCorrectly(): void + { + $composer = $this->createMock(ClassLoader::class); + $composer->method('getPrefixesPsr4')->willReturn([ + 'Laminas\\Escaper\\' => [VENDORPATH . 'composer/../laminas/laminas-escaper/src'], + ]); + + $loader = new Autoloader(); + $invoker = self::getPrivateMethodInvoker($loader, 'loadComposerNamespaces'); + + $invoker($composer, []); + + $namespaces = $loader->getNamespace(); + $this->assertArrayHasKey('Laminas\\Escaper', $namespaces); + } + public function testAutoloaderLoadsNonClassFiles(): void { $config = new Autoload();