diff --git a/res/php/alias-loader-include.tmpl.php b/res/php/alias-loader-include.tmpl.php index e58ec71..fdd980f 100644 --- a/res/php/alias-loader-include.tmpl.php +++ b/res/php/alias-loader-include.tmpl.php @@ -3,8 +3,8 @@ declare(strict_types=1); $composerAutoLoader = require dirname(__DIR__) . '/autoload.php'; -$classAliasMap = require dirname(__DIR__) . '/composer/autoload_classaliasmap.php'; $classAliasLoader = new TYPO3\ClassAliasLoader\ClassAliasLoader($composerAutoLoader); -$classAliasLoader->setAliasMap($classAliasMap); -$classAliasLoader->register('{$prepend}'); +require_once __DIR__ . '/autoload_classaliasmap_static.php'; +$classAliasLoader->setAliasMap(TYPO3\ClassAliasLoader\ClassAliasLoaderStaticInit{$suffix}::$aliasMap); +$classAliasLoader->register({$prepend}); TYPO3\ClassAliasLoader\ClassAliasMap::setClassAliasLoader($classAliasLoader); diff --git a/src/ClassAliasMapGenerator.php b/src/ClassAliasMapGenerator.php index 83fc00d..16e894b 100644 --- a/src/ClassAliasMapGenerator.php +++ b/src/ClassAliasMapGenerator.php @@ -18,6 +18,7 @@ use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use TYPO3\ClassAliasLoader\IncludeFile\PrependToken; +use TYPO3\ClassAliasLoader\IncludeFile\SuffixToken; /** * This class loops over all packages that are installed by composer and @@ -94,10 +95,24 @@ public function generateAliasMapFiles(): bool return false; } + $suffix = null; + if (!$config->get('autoloader-suffix') && is_readable($vendorPath . '/autoload.php')) { + $content = file_get_contents($vendorPath . '/autoload.php'); + if (preg_match('{ComposerAutoloaderInit([^:\s]+)::}', $content, $match)) { + $suffix = $match[1]; + } + } + if (!$suffix) { + $suffix = $config->get('autoloader-suffix') ?: md5(uniqid('', true)); + } + $includeFile = new IncludeFile( $this->io, $this->composer, [ + new SuffixToken( + $suffix + ), new PrependToken( $this->composer->getConfig() ), @@ -106,23 +121,34 @@ public function generateAliasMapFiles(): bool $includeFile->register(); $this->io->write('Generating ' . ($classAliasMappingFound ? '' : 'empty ') . 'class alias map file'); - $this->generateAliasMapFile($aliasToClassNameMapping, $classNameToAliasMapping, $targetDir); + $this->generateAliasMapFile($aliasToClassNameMapping, $classNameToAliasMapping, $targetDir, $suffix); return true; } - private function generateAliasMapFile(array $aliasToClassNameMapping, array $classNameToAliasMapping, string $targetDir): void + private function generateAliasMapFile(array $aliasToClassNameMapping, array $classNameToAliasMapping, string $targetDir, string $suffix): void { $exportArray = [ 'aliasToClassNameMapping' => $aliasToClassNameMapping, 'classNameToAliasMapping' => $classNameToAliasMapping, ]; - $fileContent = ' + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class SuffixToken implements TokenInterface +{ + /** + * @var string + */ + private $name = 'suffix'; + + public function __construct(public readonly string $suffix) {} + + public function getName(): string + { + return $this->name; + } + + public function getContent(string $includeFilePath): string + { + return $this->suffix; + } +} diff --git a/tests/Unit/IncludeFileTest.php b/tests/Unit/IncludeFileTest.php index de459ee..d3042b6 100644 --- a/tests/Unit/IncludeFileTest.php +++ b/tests/Unit/IncludeFileTest.php @@ -78,6 +78,7 @@ public function setUp(): void $this->ioMock, $this->composerMock, [ + new IncludeFile\SuffixToken('asdf'), new IncludeFile\PrependToken($configMock), ] ); @@ -93,6 +94,9 @@ public function tearDown(): void public function includeFileCanBeWritten(): void { $this->subject->register(); - self::assertTrue(file_exists($this->testDir . IncludeFile::INCLUDE_FILE)); + self::assertFileExists($this->testDir . IncludeFile::INCLUDE_FILE); + $contents = file_get_contents($this->testDir . IncludeFile::INCLUDE_FILE); + self::assertIsString($contents); + self::assertStringContainsString('ClassAliasLoaderStaticInitasdf', $contents); } }