17 use Composer\Autoload\ClassLoader;
18 use Doctrine\Common\Annotations\AnnotationReader;
19 use Doctrine\Common\Annotations\AnnotationRegistry;
20 use Psr\Container\ContainerInterface;
21 use Psr\Container\NotFoundExceptionInterface;
24 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
30 use TYPO3\CMS\Core\Package\PackageManager;
34 use TYPO3\PharStreamWrapper\Behavior;
35 use TYPO3\PharStreamWrapper\Manager;
36 use TYPO3\PharStreamWrapper\PharStreamWrapper;
81 public static function init(
82 ClassLoader $classLoader,
83 bool $failsafe =
false
84 ): ContainerInterface {
85 $requestId = substr(md5(uniqid(
'',
true)), 0, 13);
87 static::initializeClassLoader($classLoader);
92 static::startOutputBuffering();
94 $configurationManager = static::createConfigurationManager();
95 if (!static::checkIfEssentialConfigurationExists($configurationManager)) {
98 static::populateLocalConfiguration($configurationManager);
103 GeneralUtility::setSingletonInstance(LogManager::class, $logManager);
105 static::initializeErrorHandling();
106 static::initializeIO();
108 $cacheManager = static::createCacheManager($failsafe ?
true :
false);
109 $coreCache = $cacheManager->getCache(
'cache_core');
110 $assetsCache = $cacheManager->getCache(
'assets');
111 $cacheManager->setLimbo(
true);
112 $packageManager = static::createPackageManager(
113 $failsafe ? FailsafePackageManager::class : PackageManager::class,
120 GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManager);
121 GeneralUtility::setSingletonInstance(PackageManager::class, $packageManager);
124 static::initializeRuntimeActivatedPackagesFromConfiguration($packageManager);
126 static::setDefaultTimeZone();
128 static::setMemoryLimit();
131 static::$instance =
new static();
132 static::$instance->earlyInstances = [
133 ClassLoader::class => $classLoader,
134 ConfigurationManager::class => $configurationManager,
135 CacheManager::class => $cacheManager,
136 PackageManager::class => $packageManager,
142 static::loadTypo3LoadedExtAndExtLocalconf(
true, $coreCache);
143 static::setFinalCachingFrameworkCacheConfiguration($cacheManager);
144 static::unsetReservedGlobalVariables();
145 static::loadBaseTca(
true, $coreCache);
146 static::checkEncryptionKey();
148 $cacheManager->setLimbo(
false);
150 $defaultContainerEntries = [
151 ClassLoader::class => $classLoader,
152 'request.id' => $requestId,
153 ConfigurationManager::class => $configurationManager,
154 LogManager::class => $logManager,
155 CacheManager::class => $cacheManager,
156 PackageManager::class => $packageManager,
160 return new class($defaultContainerEntries) implements ContainerInterface {
171 $this->entries = $entries;
178 public function has($id)
180 if (isset($this->entries[$id])) {
185 case \TYPO3\CMS\Frontend\Http\Application::class:
186 case \TYPO3\CMS\Backend\Http\Application::class:
187 case \TYPO3\CMS\Install\Http\Application::class:
188 case \TYPO3\CMS\Core\Console\CommandApplication::class:
202 public function get($id)
206 if (isset($this->entries[$id])) {
207 return $this->entries[$id];
211 case \TYPO3\CMS\Frontend\Http\Application::class:
212 case \TYPO3\CMS\Backend\Http\Application::class:
213 $entry =
new $id($this->
get(ConfigurationManager::class));
215 case \TYPO3\CMS\Install\Http\Application::class:
217 GeneralUtility::makeInstance(\
TYPO3\CMS\Install\Http\RequestHandler::class, $this->
get(ConfigurationManager::class)),
218 GeneralUtility::makeInstance(\
TYPO3\CMS\Install\Http\InstallerRequestHandler::class)
221 case \TYPO3\CMS\Core\Console\CommandApplication::class:
225 throw new class($id .
' not found', 1518638338) extends \
Exception implements NotFoundExceptionInterface {
230 $this->entries[$id] = $entry;
243 trigger_error(
'Bootstrap::usesComposerClassLoading() will be removed in TYPO3 v10.0. Use Environment::isComposerMode() instead.', E_USER_DEPRECATED);
263 if (static::$instance ===
null) {
264 self::$instance =
new static();
266 $requestId = substr(md5(uniqid(
'',
true)), 0, 13);
267 GeneralUtility::setSingletonInstance(LogManager::class,
new LogManager($requestId));
269 return static::$instance;
279 $applicationContext = getenv(
'TYPO3_CONTEXT') ?: (getenv(
'REDIRECT_TYPO3_CONTEXT') ?:
'Production');
281 return new ApplicationContext($applicationContext);
294 return static::$instance;
329 public static function baseSetup($entryPointLevel =
null)
331 if (!defined(
'TYPO3_REQUESTTYPE')) {
332 throw new \RuntimeException(
'No Request Type was set, TYPO3 does not know in which context it is run.', 1450561838);
335 if (GeneralUtility::getApplicationContext() ===
null) {
341 return static::$instance;
356 AnnotationRegistry::registerLoader([$classLoader,
'loadClass']);
363 AnnotationReader::addGlobalIgnoredName(
'inject');
364 AnnotationReader::addGlobalIgnoredName(
'transient');
365 AnnotationReader::addGlobalIgnoredName(
'lazy');
366 AnnotationReader::addGlobalIgnoredName(
'validate');
367 AnnotationReader::addGlobalIgnoredName(
'cascade');
368 AnnotationReader::addGlobalIgnoredName(
'ignorevalidation');
369 AnnotationReader::addGlobalIgnoredName(
'cli');
370 AnnotationReader::addGlobalIgnoredName(
'flushesCaches');
371 AnnotationReader::addGlobalIgnoredName(
'uuid');
372 AnnotationReader::addGlobalIgnoredName(
'identity');
375 AnnotationReader::addGlobalIgnoredName(
'test');
378 AnnotationReader::addGlobalIgnoredName(
'extensionScannerIgnoreFile');
379 AnnotationReader::addGlobalIgnoredName(
'extensionScannerIgnoreLine');
381 return static::$instance;
394 if ($configurationManager ===
null) {
396 $configurationManager =
new ConfigurationManager;
397 static::$instance->setEarlyInstance(ConfigurationManager::class, $configurationManager);
399 return file_exists($configurationManager->getLocalConfigurationFileLocation())
415 $this->earlyInstances[$objectName] =
$instance;
429 if (!isset($this->earlyInstances[$objectName])) {
430 throw new \TYPO3\CMS\Core\Exception(
'Unknown early instance "' . $objectName .
'"', 1365167380);
432 return $this->earlyInstances[$objectName];
444 trigger_error(
'Bootstrap->getEarlyInstances() will be removed in TYPO3 v10.0. Use a simple singleton instance instead.', E_USER_DEPRECATED);
461 $allowCaching =
true,
462 $packageManagerClassName = \
TYPO3\CMS\Core\Package\PackageManager::class,
463 $isInternalCall =
false
465 if (!$isInternalCall) {
467 trigger_error(
'Bootstrap::loadConfigurationAndInitialize() will removed in TYPO3 v10.0.', E_USER_DEPRECATED);
470 $configurationManager = static::createConfigurationManager();
471 static::populateLocalConfiguration($configurationManager);
472 static::initializeErrorHandling();
474 $cacheManager = static::createCacheManager(!$allowCaching);
475 $packageManager = static::createPackageManager($packageManagerClassName, $cacheManager->getCache(
'cache_core'));
477 GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManager);
478 GeneralUtility::setSingletonInstance(PackageManager::class, $packageManager);
481 static::initializeRuntimeActivatedPackagesFromConfiguration($packageManager);
482 static::setDefaultTimezone();
484 static::setMemoryLimit();
485 return static::$instance;
497 public static function createPackageManager($packageManagerClassName, FrontendInterface $coreCache): PackageManager
499 $dependencyOrderingService = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Service\DependencyOrderingService::class);
501 $packageManager =
new $packageManagerClassName($dependencyOrderingService);
502 $packageManager->injectCoreCache($coreCache);
503 $packageManager->initialize();
505 return $packageManager;
519 trigger_error(
'Bootstrap->initializePackageManagement() will be removed in TYPO3 v10.0. Use createPackageManager() instead.', E_USER_DEPRECATED);
520 $packageManager = static::createPackageManager(
521 $packageManagerClassName,
522 GeneralUtility::makeInstance(CacheManager::class)->getCache(
'cache_core')
524 GeneralUtility::setSingletonInstance(PackageManager::class, $packageManager);
539 $packages =
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXT'][
'runtimeActivatedPackages'] ?? [];
540 if (!empty($packages)) {
541 foreach ($packages as $runtimeAddedPackageKey) {
542 $packageManager->activatePackageDuringRuntime($runtimeAddedPackageKey);
558 $coreCache = $coreCache ?? GeneralUtility::makeInstance(CacheManager::class)->getCache(
'cache_core');
561 return static::$instance;
572 return new ConfigurationManager();
585 if ($configurationManager ===
null) {
586 $configurationManager =
new ConfigurationManager();
587 static::$instance->setEarlyInstance(ConfigurationManager::class, $configurationManager);
590 $configurationManager->exportConfiguration();
592 return static::$instance;
605 $GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'caching'][
'cacheConfigurations'][
'cache_core'][
'backend']
606 = \TYPO3\CMS\Core\Cache\Backend\NullBackend::class;
607 unset(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'caching'][
'cacheConfigurations'][
'cache_core'][
'options']);
608 return static::$instance;
621 $cacheManager =
new CacheManager($disableCaching);
622 $cacheManager->setCacheConfigurations(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'caching'][
'cacheConfigurations']);
623 return $cacheManager;
637 $cacheManager = static::createCacheManager(!$allowCaching);
638 GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManager);
648 $timeZone =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'phpTimeZone'];
649 if (empty($timeZone)) {
651 $defaultTimeZone = @date_default_timezone_get();
652 if ($defaultTimeZone !==
'') {
653 $timeZone = $defaultTimeZone;
659 date_default_timezone_set($timeZone);
669 $productionExceptionHandlerClassName =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'productionExceptionHandler'];
670 $debugExceptionHandlerClassName =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'debugExceptionHandler'];
672 $errorHandlerClassName =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'errorHandler'];
673 $errorHandlerErrors =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'errorHandlerErrors'] | E_USER_DEPRECATED;
674 $exceptionalErrors =
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'exceptionalErrors'];
676 $displayErrorsSetting = (int)
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'displayErrors'];
677 switch ($displayErrorsSetting) {
679 $ipMatchesDevelopmentSystem = GeneralUtility::cmpIP(GeneralUtility::getIndpEnv(
'REMOTE_ADDR'),
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'devIPmask']);
680 $exceptionHandlerClassName = $ipMatchesDevelopmentSystem ? $debugExceptionHandlerClassName : $productionExceptionHandlerClassName;
681 $displayErrors = $ipMatchesDevelopmentSystem ? 1 : 0;
682 $exceptionalErrors = $ipMatchesDevelopmentSystem ? $exceptionalErrors : 0;
685 $exceptionHandlerClassName = $productionExceptionHandlerClassName;
689 $exceptionHandlerClassName = $debugExceptionHandlerClassName;
693 if (!(TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_INSTALL)) {
695 throw new \RuntimeException(
696 'The option $TYPO3_CONF_VARS[SYS][displayErrors] is not set to "-1", "0" or "1".',
701 @ini_set(
'display_errors', (
string)$displayErrors);
703 if (!empty($errorHandlerClassName)) {
705 $errorHandler = GeneralUtility::makeInstance($errorHandlerClassName, $errorHandlerErrors);
706 $errorHandler->setExceptionalErrors($exceptionalErrors);
707 if (is_callable([$errorHandler,
'setDebugMode'])) {
708 $errorHandler->setDebugMode($displayErrors === 1);
710 if (is_callable([$errorHandler,
'registerErrorHandler'])) {
711 $errorHandler->registerErrorHandler();
714 if (!empty($exceptionHandlerClassName)) {
716 GeneralUtility::makeInstance($exceptionHandlerClassName);
725 if (in_array(
'phar', stream_get_wrappers())) {
733 stream_wrapper_unregister(
'phar');
734 stream_wrapper_register(
'phar', PharStreamWrapper::class);
744 if ((
int)
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'setMemoryLimit'] > 16) {
745 @ini_set(
'memory_limit', (
string)((
int)
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'setMemoryLimit'] .
'm'));
761 if (defined(
'TYPO3_REQUESTTYPE_FE')) {
764 define(
'TYPO3_REQUESTTYPE_FE', 1);
765 define(
'TYPO3_REQUESTTYPE_BE', 2);
766 define(
'TYPO3_REQUESTTYPE_CLI', 4);
767 define(
'TYPO3_REQUESTTYPE_AJAX', 8);
768 define(
'TYPO3_REQUESTTYPE_INSTALL', 16);
781 if (defined(
'TYPO3_REQUESTTYPE')) {
782 throw new \RuntimeException(
'TYPO3_REQUESTTYPE has already been set, cannot be called multiple times', 1450561878);
784 define(
'TYPO3_REQUESTTYPE', $requestType);
798 if ($cacheManager ===
null) {
799 $cacheManager = GeneralUtility::makeInstance(CacheManager::class);
801 $cacheManager->setCacheConfigurations(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'caching'][
'cacheConfigurations']);
802 return static::$instance;
823 return static::$instance;
836 public static function loadBaseTca(
bool $allowCaching =
true, FrontendInterface $coreCache =
null)
839 $coreCache = $coreCache ?? GeneralUtility::makeInstance(CacheManager::class)->getCache(
'cache_core');
842 return static::$instance;
850 if (empty(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'encryptionKey'])) {
851 throw new \RuntimeException(
852 'TYPO3 Encryption is empty. $GLOBALS[\'TYPO3_CONF_VARS\'][\'SYS\'][\'encryptionKey\'] needs to be set for TYPO3 to work securely',
871 static::runExtTablesPostProcessingHooks();
872 return static::$instance;
882 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'GLOBAL'][
'extTablesInclusion-PostProcessing'] ?? [] as $className) {
884 $hookObject = GeneralUtility::makeInstance($className);
885 if (!$hookObject instanceof \
TYPO3\CMS\Core\Database\TableConfigurationPostProcessingHookInterface) {
886 throw new \UnexpectedValueException(
887 '$hookObject "' . $className .
'" must implement interface TYPO3\\CMS\\Core\\Database\\TableConfigurationPostProcessingHookInterface',
891 $hookObject->processData();
908 $codeCache = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Cache\CacheManager::class)->getCache(
'cache_core');
909 $routesFromPackages = [];
910 if ($codeCache->has($cacheIdentifier)) {
912 $routesFromPackages = unserialize(substr($codeCache->get($cacheIdentifier), 6, -2));
915 $packageManager = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Package\PackageManager::class);
916 $packages = $packageManager->getActivePackages();
917 foreach ($packages as $package) {
918 $routesFileNameForPackage = $package->getPackagePath() .
'Configuration/Backend/Routes.php';
919 if (file_exists($routesFileNameForPackage)) {
920 $definedRoutesInPackage = require $routesFileNameForPackage;
921 if (is_array($definedRoutesInPackage)) {
922 $routesFromPackages = array_merge($routesFromPackages, $definedRoutesInPackage);
925 $routesFileNameForPackage = $package->getPackagePath() .
'Configuration/Backend/AjaxRoutes.php';
926 if (file_exists($routesFileNameForPackage)) {
927 $definedRoutesInPackage = require $routesFileNameForPackage;
928 if (is_array($definedRoutesInPackage)) {
929 foreach ($definedRoutesInPackage as $routeIdentifier => $routeOptions) {
931 $routeOptions[
'path'] =
'/ajax' . $routeOptions[
'path'];
932 $routesFromPackages[
'ajax_' . $routeIdentifier] = $routeOptions;
933 $routesFromPackages[
'ajax_' . $routeIdentifier][
'ajax'] =
true;
939 $codeCache->set($cacheIdentifier, serialize($routesFromPackages));
943 $router = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\Router::class);
944 foreach ($routesFromPackages as $name => $options) {
945 $path = $options[
'path'];
946 unset($options[
'path']);
947 $route = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\Route::class, $path, $options);
948 $router->addRoute($name, $route);
950 return static::$instance;
963 $backendUser = GeneralUtility::makeInstance($className);
967 $backendUser->start();
968 return static::$instance;
980 $GLOBALS[
'BE_USER']->backendCheckLogin($proceedIfNoUserIsLoggedIn);
981 return static::$instance;
993 $GLOBALS[
'LANG'] = GeneralUtility::makeInstance(\
TYPO3\CMS\Core\Localization\LanguageService::class);
995 return static::$instance;
1007 public static function __callStatic($methodName, array $arguments)
1009 switch ($methodName) {
1010 case 'checkIfEssentialConfigurationExists':
1011 case 'setFinalCachingFrameworkCacheConfiguration':
1012 case 'populateLocalConfiguration':
1013 return call_user_func_array([self::class, $methodName], $arguments);
1015 throw new \Error(sprintf(
'Call to undefined method "%s"', $methodName), 1534156090);
1028 public function __call($methodName, array $arguments)