‪TYPO3CMS  ‪main
ClassLoadingInformation.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
16 namespace ‪TYPO3\CMS\Core\Core;
17 
18 use Composer\Autoload\ClassLoader;
19 use TYPO3\ClassAliasLoader\ClassAliasMap;
23 use TYPO3\CMS\Core\Package\PackageManager;
25 
35 {
39  public const ‪AUTOLOAD_INFO_DIR = 'autoload/';
40 
44  public const ‪AUTOLOAD_INFO_DIR_TESTS = 'autoload-tests/';
45 
49  public const ‪AUTOLOAD_CLASSMAP_FILENAME = 'autoload_classmap.php';
50 
54  public const ‪AUTOLOAD_PSR4_FILENAME = 'autoload_psr4.php';
55 
59  public const ‪AUTOLOAD_CLASSALIASMAP_FILENAME = 'autoload_classaliasmap.php';
60 
64  protected static ‪$classLoader;
65 
71  public static function ‪setClassLoader(ClassLoader ‪$classLoader)
72  {
73  static::$classLoader = ‪$classLoader;
74  }
75 
82  public static function ‪isClassLoadingInformationAvailable()
83  {
84  return file_exists(self::getClassLoadingInformationDirectory() . self::AUTOLOAD_CLASSMAP_FILENAME);
85  }
86 
90  public static function ‪dumpClassLoadingInformation()
91  {
93  $composerClassLoader = static::getClassLoader();
94  $activeExtensionPackages = static::getActiveExtensionPackages();
95 
96  $generator = GeneralUtility::makeInstance(ClassLoadingInformationGenerator::class, $composerClassLoader, $activeExtensionPackages, ‪Environment::getPublicPath() . '/', self::isTestingContext());
97  $classInfoFiles = $generator->buildAutoloadInformationFiles();
98  ‪GeneralUtility::writeFile(self::getClassLoadingInformationDirectory() . self::AUTOLOAD_CLASSMAP_FILENAME, $classInfoFiles['classMapFile']);
99  ‪GeneralUtility::writeFile(self::getClassLoadingInformationDirectory() . self::AUTOLOAD_PSR4_FILENAME, $classInfoFiles['psr-4File']);
100 
101  $classAliasMapFile = $generator->buildClassAliasMapFile();
102  ‪GeneralUtility::writeFile(self::getClassLoadingInformationDirectory() . self::AUTOLOAD_CLASSALIASMAP_FILENAME, $classAliasMapFile);
103  }
104 
108  public static function ‪updateClassLoadingInformationAfterPackageDeactivation(AfterPackageDeactivationEvent $event): void
109  {
111  return;
112  }
113  static::dumpClassLoadingInformation();
114  }
115 
119  public static function ‪updateClassLoadingInformationAfterPackageActivation(AfterPackageActivationEvent $event): void
120  {
122  return;
123  }
124  static::dumpClassLoadingInformation();
125  }
126 
131  public static function ‪registerClassLoadingInformation()
132  {
133  $composerClassLoader = static::getClassLoader();
134 
136  if (file_exists($dynamicClassAliasMapFile)) {
137  $classAliasMap = require $dynamicClassAliasMapFile;
138  if (is_array($classAliasMap) && !empty($classAliasMap['aliasToClassNameMapping']) && !empty($classAliasMap['classNameToAliasMapping'])) {
139  ClassAliasMap::addAliasMap($classAliasMap);
140  }
141  }
142 
144  if (file_exists($dynamicClassMapFile)) {
145  $classMap = require $dynamicClassMapFile;
146  if (!empty($classMap) && is_array($classMap)) {
147  $composerClassLoader->addClassMap($classMap);
148  }
149  }
150 
152  if (file_exists($dynamicPsr4File)) {
153  $psr4 = require $dynamicPsr4File;
154  if (is_array($psr4)) {
155  foreach ($psr4 as $prefix => $paths) {
156  $composerClassLoader->setPsr4($prefix, $paths);
157  }
158  }
159  }
160  }
161 
167  public static function ‪registerTransientClassLoadingInformationForPackage(PackageInterface $package)
168  {
169  $composerClassLoader = static::getClassLoader();
170  $activeExtensionPackages = static::getActiveExtensionPackages();
171 
172  $generator = GeneralUtility::makeInstance(ClassLoadingInformationGenerator::class, $composerClassLoader, $activeExtensionPackages, ‪Environment::getPublicPath() . '/', self::isTestingContext());
173 
174  $classInformation = $generator->buildClassLoadingInformationForPackage($package);
175  $composerClassLoader->addClassMap($classInformation['classMap']);
176  foreach ($classInformation['psr-4'] as $prefix => $paths) {
177  $composerClassLoader->setPsr4($prefix, $paths);
178  }
179  $classAliasMap = $generator->buildClassAliasMapForPackage($package);
180  if (is_array($classAliasMap) && !empty($classAliasMap['aliasToClassNameMapping']) && !empty($classAliasMap['classNameToAliasMapping'])) {
181  ClassAliasMap::addAliasMap($classAliasMap);
182  }
183  }
184 
188  protected static function ‪getClassLoadingInformationDirectory()
189  {
190  if (self::isTestingContext()) {
192  }
194  }
195 
202  public static function ‪getClassNameForAlias($alias)
203  {
204  return ClassAliasMap::getClassNameForAlias($alias);
205  }
206 
211  protected static function ‪ensureAutoloadInfoDirExists()
212  {
214  if (!file_exists($autoloadInfoDir)) {
215  ‪GeneralUtility::mkdir_deep($autoloadInfoDir);
216  }
217  }
218 
225  public static function ‪getClassLoader()
226  {
227  return static::$classLoader;
228  }
229 
236  protected static function ‪isTestingContext()
237  {
238  return ‪Environment::getContext()->isTesting();
239  }
240 
246  protected static function ‪getActiveExtensionPackages()
247  {
248  $activeExtensionPackages = [];
249  $packageManager = GeneralUtility::makeInstance(PackageManager::class);
250  foreach ($packageManager->getActivePackages() as $package) {
251  if ($package->getPackageMetaData()->isFrameworkType()) {
252  // Skip all core packages as the class loading info is prepared for them already
253  continue;
254  }
255  $activeExtensionPackages[] = $package;
256  }
257  return $activeExtensionPackages;
258  }
259 }
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\AUTOLOAD_PSR4_FILENAME
‪const AUTOLOAD_PSR4_FILENAME
Definition: ClassLoadingInformation.php:54
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\AUTOLOAD_CLASSALIASMAP_FILENAME
‪const AUTOLOAD_CLASSALIASMAP_FILENAME
Definition: ClassLoadingInformation.php:59
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\getClassLoader
‪static ClassLoader getClassLoader()
Definition: ClassLoadingInformation.php:224
‪TYPO3\CMS\Core\Core\Environment\isComposerMode
‪static isComposerMode()
Definition: Environment.php:137
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static getPublicPath()
Definition: Environment.php:187
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\dumpClassLoadingInformation
‪static dumpClassLoadingInformation()
Definition: ClassLoadingInformation.php:89
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\getClassLoadingInformationDirectory
‪static string getClassLoadingInformationDirectory()
Definition: ClassLoadingInformation.php:187
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\isClassLoadingInformationAvailable
‪static bool isClassLoadingInformationAvailable()
Definition: ClassLoadingInformation.php:81
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\ensureAutoloadInfoDirExists
‪static ensureAutoloadInfoDirExists()
Definition: ClassLoadingInformation.php:210
‪TYPO3\CMS\Core\Core\ClassLoadingInformation
Definition: ClassLoadingInformation.php:35
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\updateClassLoadingInformationAfterPackageActivation
‪static updateClassLoadingInformationAfterPackageActivation(AfterPackageActivationEvent $event)
Definition: ClassLoadingInformation.php:118
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\getActiveExtensionPackages
‪static PackageInterface[] getActiveExtensionPackages()
Definition: ClassLoadingInformation.php:245
‪TYPO3\CMS\Core\Core\Environment\getLegacyConfigPath
‪static getLegacyConfigPath()
Definition: Environment.php:279
‪TYPO3\CMS\Core\Package\PackageInterface
Definition: PackageInterface.php:22
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\AUTOLOAD_CLASSMAP_FILENAME
‪const AUTOLOAD_CLASSMAP_FILENAME
Definition: ClassLoadingInformation.php:49
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\AUTOLOAD_INFO_DIR
‪const AUTOLOAD_INFO_DIR
Definition: ClassLoadingInformation.php:39
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1753
‪TYPO3\CMS\Core\Package\Event\AfterPackageActivationEvent
Definition: AfterPackageActivationEvent.php:24
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\updateClassLoadingInformationAfterPackageDeactivation
‪static updateClassLoadingInformationAfterPackageDeactivation(AfterPackageDeactivationEvent $event)
Definition: ClassLoadingInformation.php:107
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\getClassNameForAlias
‪static class string getClassNameForAlias($alias)
Definition: ClassLoadingInformation.php:201
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\AUTOLOAD_INFO_DIR_TESTS
‪const AUTOLOAD_INFO_DIR_TESTS
Definition: ClassLoadingInformation.php:44
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\registerTransientClassLoadingInformationForPackage
‪static registerTransientClassLoadingInformationForPackage(PackageInterface $package)
Definition: ClassLoadingInformation.php:166
‪TYPO3\CMS\Core\Package\Event\AfterPackageDeactivationEvent
Definition: AfterPackageDeactivationEvent.php:24
‪TYPO3\CMS\Core\Core
Definition: ApplicationContext.php:16
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\registerClassLoadingInformation
‪static registerClassLoadingInformation()
Definition: ClassLoadingInformation.php:130
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\$classLoader
‪static ClassLoader $classLoader
Definition: ClassLoadingInformation.php:63
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Utility\GeneralUtility\writeFile
‪static bool writeFile($file, $content, $changePermissions=false)
Definition: GeneralUtility.php:1567
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static getContext()
Definition: Environment.php:128
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\setClassLoader
‪static setClassLoader(ClassLoader $classLoader)
Definition: ClassLoadingInformation.php:70
‪TYPO3\CMS\Core\Core\ClassLoadingInformation\isTestingContext
‪static bool isTestingContext()
Definition: ClassLoadingInformation.php:235