diff --git a/typo3/sysext/core/Classes/Imaging/IconFactory.php b/typo3/sysext/core/Classes/Imaging/IconFactory.php index 4f191256179685e5d88967ddbf5ca54ceb96cbda..7644a16430a76d19608e3988bb05ecbff2b8a4fa 100644 --- a/typo3/sysext/core/Classes/Imaging/IconFactory.php +++ b/typo3/sysext/core/Classes/Imaging/IconFactory.php @@ -68,10 +68,10 @@ class IconFactory * @param EventDispatcherInterface $eventDispatcher * @param IconRegistry $iconRegistry */ - public function __construct(EventDispatcherInterface $eventDispatcher = null, IconRegistry $iconRegistry = null) + public function __construct(EventDispatcherInterface $eventDispatcher, IconRegistry $iconRegistry) { - $this->eventDispatcher = $eventDispatcher ?? GeneralUtility::getContainer()->get(EventDispatcherInterface::class); - $this->iconRegistry = $iconRegistry ?? GeneralUtility::makeInstance(IconRegistry::class); + $this->eventDispatcher = $eventDispatcher; + $this->iconRegistry = $iconRegistry; $this->recordStatusMapping = $GLOBALS['TYPO3_CONF_VARS']['SYS']['IconFactory']['recordStatusMapping']; $this->overlayPriorities = $GLOBALS['TYPO3_CONF_VARS']['SYS']['IconFactory']['overlayPriorities']; } diff --git a/typo3/sysext/core/Classes/Localization/LanguageService.php b/typo3/sysext/core/Classes/Localization/LanguageService.php index 76d0baa8e60b54ae5c60913b9d53686ada03e7ec..d419bc2690acf69dfe2eba83da2ed383a7b514f1 100644 --- a/typo3/sysext/core/Classes/Localization/LanguageService.php +++ b/typo3/sysext/core/Classes/Localization/LanguageService.php @@ -105,10 +105,22 @@ class LanguageService protected $labels = []; /** - * LanguageService constructor. + * @var Locales */ - public function __construct() + protected $locales; + + /** + * @var LocalizationFactory + */ + protected $localizationFactory; + + /** + * @internal use one of the factory methods instead + */ + public function __construct(Locales $locales, LocalizationFactory $localizationFactory) { + $this->locales = $locales; + $this->localizationFactory = $localizationFactory; $this->debugKey = (bool)$GLOBALS['TYPO3_CONF_VARS']['BE']['languageDebug']; } @@ -124,13 +136,12 @@ class LanguageService public function init($languageKey) { // Find the requested language in this list based on the $languageKey - $locales = GeneralUtility::makeInstance(Locales::class); // Language is found. Configure it: - if (in_array($languageKey, $locales->getLocales(), true)) { + if (in_array($languageKey, $this->locales->getLocales(), true)) { // The current language key $this->lang = $languageKey; $this->languageDependencies[] = $languageKey; - foreach ($locales->getLocaleDependencies($languageKey) as $language) { + foreach ($this->locales->getLocaleDependencies($languageKey) as $language) { $this->languageDependencies[] = $language; } } @@ -371,9 +382,6 @@ class LanguageService return $this->languageFileCache[$fileRef . $this->lang]; } - /** @var LocalizationFactory $languageFactory */ - $languageFactory = GeneralUtility::makeInstance(LocalizationFactory::class); - if ($this->lang !== 'default') { $languages = array_reverse($this->languageDependencies); } else { @@ -381,7 +389,7 @@ class LanguageService } $localLanguage = []; foreach ($languages as $language) { - $tempLL = $languageFactory->getParsedData($fileRef, $language); + $tempLL = $this->localizationFactory->getParsedData($fileRef, $language); $localLanguage['default'] = $tempLL['default']; if (!isset($localLanguage[$this->lang])) { $localLanguage[$this->lang] = $localLanguage['default']; @@ -435,9 +443,7 @@ class LanguageService */ public static function create(string $locale): self { - $obj = GeneralUtility::makeInstance(LanguageService::class); - $obj->init($locale); - return $obj; + return GeneralUtility::makeInstance(LanguageServiceFactory::class)->create($locale); } public static function createFromUserPreferences(?AbstractUserAuthentication $user): self diff --git a/typo3/sysext/core/Classes/Localization/LanguageServiceFactory.php b/typo3/sysext/core/Classes/Localization/LanguageServiceFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..3768d42bf592c49ab91bbc0a681c8baa38bf8b1e --- /dev/null +++ b/typo3/sysext/core/Classes/Localization/LanguageServiceFactory.php @@ -0,0 +1,53 @@ +<?php + +declare(strict_types=1); + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +namespace TYPO3\CMS\Core\Localization; + +/** + * @internal + */ +class LanguageServiceFactory +{ + /** + * @var Locales + */ + protected $locales; + + /** + * @var LocalizationFactory + */ + protected $localizationFactory; + + public function __construct(Locales $locales, LocalizationFactory $localizationFactory) + { + $this->locales = $locales; + $this->localizationFactory = $localizationFactory; + } + + /** + * Factory method to create a language service object. + * + * @param string $locale the locale (= the TYPO3-internal locale given) + * @return LanguageService + */ + public function create(string $locale): LanguageService + { + $obj = new LanguageService($this->locales, $this->localizationFactory); + $obj->init($locale); + return $obj; + } +} diff --git a/typo3/sysext/core/Classes/Localization/LocalizationFactory.php b/typo3/sysext/core/Classes/Localization/LocalizationFactory.php index ea30ff67f653445995adef8b7f227b7ef31c6628..0e1694c0a39b4763afb84f643dab33af48c190bc 100644 --- a/typo3/sysext/core/Classes/Localization/LocalizationFactory.php +++ b/typo3/sysext/core/Classes/Localization/LocalizationFactory.php @@ -36,21 +36,10 @@ class LocalizationFactory implements SingletonInterface */ public $store; - /** - * Class constructor - */ - public function __construct() - { - $this->store = GeneralUtility::makeInstance(LanguageStore::class); - $this->initializeCache(); - } - - /** - * Initialize cache instance to be ready to use - */ - protected function initializeCache() + public function __construct(LanguageStore $languageStore, CacheManager $cacheManager) { - $this->cacheInstance = GeneralUtility::makeInstance(CacheManager::class)->getCache('l10n'); + $this->store = $languageStore; + $this->cacheInstance = $cacheManager->getCache('l10n'); } /** diff --git a/typo3/sysext/core/Classes/ServiceProvider.php b/typo3/sysext/core/Classes/ServiceProvider.php index d5b534ef3c2bfde1bcf11b4ed53381f1e025eadb..b38da10e6d0c8b46fc63ba724c5b7438baa966d1 100644 --- a/typo3/sysext/core/Classes/ServiceProvider.php +++ b/typo3/sysext/core/Classes/ServiceProvider.php @@ -20,6 +20,7 @@ namespace TYPO3\CMS\Core; use ArrayObject; use Psr\Container\ContainerInterface; use Psr\EventDispatcher\EventDispatcherInterface; +use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Package\AbstractServiceProvider; /** @@ -36,15 +37,37 @@ class ServiceProvider extends AbstractServiceProvider { return [ Cache\CacheManager::class => [ static::class, 'getCacheManager' ], + Charset\CharsetConverter::class => [ static::class, 'getCharsetConverter' ], + Configuration\SiteConfiguration::class => [ static::class, 'getSiteConfiguration' ], Console\CommandApplication::class => [ static::class, 'getConsoleCommandApplication' ], Console\CommandRegistry::class => [ static::class, 'getConsoleCommandRegistry' ], Context\Context::class => [ static::class, 'getContext' ], + Crypto\PasswordHashing\PasswordHashFactory::class => [ static::class, 'getPasswordHashFactory' ], EventDispatcher\EventDispatcher::class => [ static::class, 'getEventDispatcher' ], EventDispatcher\ListenerProvider::class => [ static::class, 'getEventListenerProvider' ], Http\MiddlewareStackResolver::class => [ static::class, 'getMiddlewareStackResolver' ], - Service\DependencyOrderingService::class => [ static::class, 'getDependencyOrderingService' ], - Crypto\PasswordHashing\PasswordHashFactory::class => [ static::class, 'getPasswordHashFactory' ], + Http\RequestFactory::class => [ static::class, 'getRequestFactory' ], + Imaging\IconFactory::class => [ static::class, 'getIconFactory' ], + Imaging\IconRegistry::class => [ static::class, 'getIconRegistry' ], + Localization\LanguageServiceFactory::class => [ static::class, 'getLanguageServiceFactory' ], + Localization\LanguageStore::class => [ static::class, 'getLanguageStore' ], + Localization\Locales::class => [ static::class, 'getLocales' ], + Localization\LocalizationFactory::class => [ static::class, 'getLocalizationFactory' ], + Mail\TransportFactory::class => [ static::class, 'getMailTransportFactory' ], + Messaging\FlashMessageService::class => [ static::class, 'getFlashMessageService' ], + Package\FailsafePackageManager::class => [ static::class, 'getFailsafePackageManager' ], + Registry::class => [ static::class, 'getRegistry' ], + Resource\Index\FileIndexRepository::class => [ static::class, 'getFileIndexRepository' ], + Resource\Driver\DriverRegistry::class => [ static::class, 'getDriverRegistry' ], + Resource\ProcessedFileRepository::class => [ static::class, 'getProcessedFileRepository' ], Resource\ResourceFactory::class => [ static::class, 'getResourceFactory' ], + Resource\StorageRepository::class => [ static::class, 'getStorageRepository' ], + Service\DependencyOrderingService::class => [ static::class, 'getDependencyOrderingService' ], + Service\FlexFormService::class => [ static::class, 'getFlexFormService' ], + Service\OpcodeCacheService::class => [ static::class, 'getOpcodeCacheService' ], + TimeTracker\TimeTracker::class => [ static::class, 'getTimeTracker' ], + TypoScript\Parser\ConstantConfigurationParser::class => [ static::class, 'getTypoScriptConstantConfigurationParser' ], + TypoScript\TypoScriptService::class => [ static::class, 'getTypoScriptService' ], 'middlewares' => [ static::class, 'getMiddlewares' ], ]; } @@ -81,6 +104,16 @@ class ServiceProvider extends AbstractServiceProvider return $cacheManager; } + public static function getCharsetConverter(ContainerInterface $container): Charset\CharsetConverter + { + return self::new($container, Charset\CharsetConverter::class); + } + + public static function getSiteConfiguration(ContainerInterface $container): Configuration\SiteConfiguration + { + return new Configuration\SiteConfiguration(Environment::getConfigPath() . '/sites'); + } + public static function getConsoleCommandApplication(ContainerInterface $container): Console\CommandApplication { return new Console\CommandApplication( @@ -118,11 +151,6 @@ class ServiceProvider extends AbstractServiceProvider return $listenerProvider; } - public static function getDependencyOrderingService(ContainerInterface $container): Service\DependencyOrderingService - { - return new Service\DependencyOrderingService(); - } - public static function getContext(ContainerInterface $container): Context\Context { return new Context\Context(); @@ -133,13 +161,84 @@ class ServiceProvider extends AbstractServiceProvider return new Crypto\PasswordHashing\PasswordHashFactory(); } - public static function getMiddlewareStackResolver(ContainerInterface $container): Http\MiddlewareStackResolver + public static function getIconFactory(ContainerInterface $container): Imaging\IconFactory { - return new Http\MiddlewareStackResolver( - $container, - $container->get(Service\DependencyOrderingService::class), - $container->get('cache.core') - ); + return self::new($container, Imaging\IconFactory::class, [ + $container->get(EventDispatcherInterface::class), + $container->get(Imaging\IconRegistry::class) + ]); + } + + public static function getIconRegistry(ContainerInterface $container): Imaging\IconRegistry + { + return self::new($container, Imaging\IconRegistry::class); + } + + public static function getLanguageServiceFactory(ContainerInterface $container): Localization\LanguageServiceFactory + { + return self::new($container, Localization\LanguageServiceFactory::class, [ + $container->get(Localization\Locales::class), + $container->get(Localization\LocalizationFactory::class) + ]); + } + + public static function getLanguageStore(ContainerInterface $container): Localization\LanguageStore + { + return self::new($container, Localization\LanguageStore::class); + } + + public static function getLocales(ContainerInterface $container): Localization\Locales + { + return self::new($container, Localization\Locales::class); + } + + public static function getLocalizationFactory(ContainerInterface $container): Localization\LocalizationFactory + { + return self::new($container, Localization\LocalizationFactory::class, [ + $container->get(Localization\LanguageStore::class), + $container->get(Cache\CacheManager::class) + ]); + } + + public static function getMailTransportFactory(ContainerInterface $container): Mail\TransportFactory + { + return self::new($container, Mail\TransportFactory::class); + } + + public static function getFlashMessageService(ContainerInterface $container): Messaging\FlashMessageService + { + return self::new($container, Messaging\FlashMessageService::class); + } + + public static function getFailsafePackageManager(ContainerInterface $container): Package\FailsafePackageManager + { + $packageManager = $container->get(Package\PackageManager::class); + if ($packageManager instanceof Package\FailsafePackageManager) { + return $packageManager; + } + throw new \RuntimeException('FailsafePackageManager can only be instantiated in failsafe (maintenance tool) mode.', 1586861816); + } + + public static function getRegistry(ContainerInterface $container): Registry + { + return self::new($container, Registry::class); + } + + public static function getFileIndexRepository(ContainerInterface $container): Resource\Index\FileIndexRepository + { + return self::new($container, Resource\Index\FileIndexRepository::class, [ + $container->get(EventDispatcherInterface::class) + ]); + } + + public static function getDriverRegistry(ContainerInterface $container): Resource\Driver\DriverRegistry + { + return self::new($container, Resource\Driver\DriverRegistry::class); + } + + public static function getProcessedFileRepository(ContainerInterface $container): Resource\ProcessedFileRepository + { + return self::new($container, Resource\ProcessedFileRepository::class); } public static function getResourceFactory(ContainerInterface $container): Resource\ResourceFactory @@ -149,6 +248,55 @@ class ServiceProvider extends AbstractServiceProvider ]); } + public static function getStorageRepository(ContainerInterface $container): Resource\StorageRepository + { + return self::new($container, Resource\StorageRepository::class); + } + + public static function getDependencyOrderingService(ContainerInterface $container): Service\DependencyOrderingService + { + return new Service\DependencyOrderingService(); + } + + public static function getFlexFormService(ContainerInterface $container): Service\FlexFormService + { + return self::new($container, Service\FlexFormService::class); + } + + public static function getOpcodeCacheService(ContainerInterface $container): Service\OpcodeCacheService + { + return self::new($container, Service\OpcodeCacheService::class); + } + + public static function getTimeTracker(ContainerInterface $container): TimeTracker\TimeTracker + { + return self::new($container, TimeTracker\TimeTracker::class); + } + + public static function getTypoScriptConstantConfigurationParser(ContainerInterface $container): TypoScript\Parser\ConstantConfigurationParser + { + return self::new($container, TypoScript\Parser\ConstantConfigurationParser::class); + } + + public static function getTypoScriptService(ContainerInterface $container): TypoScript\TypoScriptService + { + return self::new($container, TypoScript\TypoScriptService::class); + } + + public static function getRequestFactory(ContainerInterface $container): Http\RequestFactory + { + return new Http\RequestFactory(); + } + + public static function getMiddlewareStackResolver(ContainerInterface $container): Http\MiddlewareStackResolver + { + return new Http\MiddlewareStackResolver( + $container, + $container->get(Service\DependencyOrderingService::class), + $container->get('cache.core') + ); + } + public static function getMiddlewares(ContainerInterface $container): ArrayObject { return new ArrayObject(); diff --git a/typo3/sysext/core/Configuration/Services.yaml b/typo3/sysext/core/Configuration/Services.yaml index 2b461c5e46679ef7d2f84a4ce074d3195b2c755e..4e3000f43087f223fc2c5ea4621390306d65092a 100644 --- a/typo3/sysext/core/Configuration/Services.yaml +++ b/typo3/sysext/core/Configuration/Services.yaml @@ -56,9 +56,6 @@ services: arguments: $configPath: "%env(TYPO3:configPath)%/sites" - TYPO3\CMS\Core\Package\FailsafePackageManager: - autoconfigure: false - TYPO3\CMS\Core\Package\UnitTestPackageManager: autoconfigure: false @@ -321,6 +318,15 @@ services: method: 'addCategoryDatabaseSchema' event: TYPO3\CMS\Core\Database\Event\AlterTableDefinitionStatementsEvent + # @internal + # @todo: deprecate makeInstance(LanguageService::class) + # This service entry is provided for legacy code that instantiates LanguageService + # using GeneralUtility::makeInstance instead of the factory methods which itself + # use LanguageServiceFactory (for install tool compatibility). + TYPO3\CMS\Core\Localization\LanguageService: + shared: false + public: true + TYPO3\CMS\Core\Page\AssetRenderer: public: true arguments: diff --git a/typo3/sysext/core/Tests/Functional/Database/QueryGeneratorTest.php b/typo3/sysext/core/Tests/Functional/Database/QueryGeneratorTest.php index 43e71dfe416ea55d00ddfd655614f6ed46846b0d..28338a688bb52faedc3436c1efcbaa488a5d3128 100644 --- a/typo3/sysext/core/Tests/Functional/Database/QueryGeneratorTest.php +++ b/typo3/sysext/core/Tests/Functional/Database/QueryGeneratorTest.php @@ -32,7 +32,7 @@ class QueryGeneratorTest extends FunctionalTestCase { parent::setUp(); $this->setUpBackendUserFromFixture(1); - $GLOBALS['LANG'] = new LanguageService(); + $GLOBALS['LANG'] = LanguageService::create('default'); } /** diff --git a/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php b/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php index 2991190906ff4f57135680842feeb601f84d7687..26232f5204f1cc8031844ef4001a76e767b3ec64 100644 --- a/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php +++ b/typo3/sysext/core/Tests/Unit/DataHandling/DataHandlerTest.php @@ -943,8 +943,6 @@ class DataHandlerTest extends UnitTestCase */ public function checkValueForInputConvertsNullToEmptyString() { - $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class); - $GLOBALS['LANG']->init('default'); $expectedResult = ['value' => '']; self::assertSame($expectedResult, $this->subject->_call('checkValueForInput', null, ['type' => 'string', 'max' => 40], 'tt_content', 'NEW55c0e67f8f4d32.04974534', 89, 'table_caption')); } diff --git a/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php b/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php index 7e4d8a302fd738be37c5efa4b85b1748301c900a..e5242562c015f9d5bed203eb7dd8c68b6cd02484 100644 --- a/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php +++ b/typo3/sysext/core/Tests/Unit/Error/ProductionExceptionHandlerTest.php @@ -18,6 +18,7 @@ namespace TYPO3\CMS\Core\Tests\Unit\Error; use Prophecy\Argument; use Psr\Log\LoggerInterface; use TYPO3\CMS\Core\Error\ProductionExceptionHandler; +use TYPO3\CMS\Core\Information\Typo3Information; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; @@ -51,6 +52,9 @@ class ProductionExceptionHandlerTest extends UnitTestCase */ public function echoExceptionWebEscapesExceptionMessage() { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $message = '<b>b</b><script>alert(1);</script>'; $exception = new \Exception($message, 1476049364); ob_start(); @@ -66,6 +70,9 @@ class ProductionExceptionHandlerTest extends UnitTestCase */ public function echoExceptionWebEscapesExceptionTitle() { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $title = '<b>b</b><script>alert(1);</script>'; /** @var $exception \Exception|\PHPUnit\Framework\MockObject\MockObject */ $exception = $this->getMockBuilder('Exception') @@ -120,6 +127,9 @@ class ProductionExceptionHandlerTest extends UnitTestCase */ public function logEntriesContainAnonymousTokens(string $originalUrl, string $expectedUrl) { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $subject = new ProductionExceptionHandler(); $logger = $this->prophesize(LoggerInterface::class); $logger->critical(Argument::containingString($expectedUrl), Argument::cetera())->shouldBeCalled(); diff --git a/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php b/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php index 03b94a2f17f334f75eb6cd6e78ac5bfb4dbe2b7f..21ddcc9630e43cb49d73cbd42b2eb7d57dbf090d 100644 --- a/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php +++ b/typo3/sysext/core/Tests/Unit/Imaging/IconTest.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; +use TYPO3\CMS\Core\Imaging\IconRegistry; use TYPO3\CMS\Core\Type\Icon\IconState; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; @@ -58,7 +59,7 @@ class IconTest extends UnitTestCase $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); $eventDispatcherProphecy = $this->prophesize(EventDispatcherInterface::class); - $iconFactory = new IconFactory($eventDispatcherProphecy->reveal()); + $iconFactory = new IconFactory($eventDispatcherProphecy->reveal(), new IconRegistry()); $this->subject = $iconFactory->getIcon($this->iconIdentifier, Icon::SIZE_SMALL, $this->overlayIdentifier, IconState::cast(IconState::STATE_DISABLED)); } diff --git a/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php b/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php index 784e8c351a11a163686f0e611e446cdf118c8ac5..a87b0aae1faf9b8ee90ee4a7906f27f700daf562 100644 --- a/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php +++ b/typo3/sysext/core/Tests/Unit/Localization/LocalizationFactoryTest.php @@ -20,7 +20,6 @@ use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend; use TYPO3\CMS\Core\Localization\Exception\FileNotFoundException; use TYPO3\CMS\Core\Localization\LanguageStore; use TYPO3\CMS\Core\Localization\LocalizationFactory; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** @@ -28,21 +27,11 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase; */ class LocalizationFactoryTest extends UnitTestCase { - public function tearDown(): void - { - // Drop created singletons again - GeneralUtility::purgeInstances(); - parent::tearDown(); - } - /** * @test */ public function getParsedDataCallsLocalizationOverrideIfFileNotFoundExceptionIsThrown() { - $cacheManagerProphecy = $this->prophesize(CacheManager::class); - GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManagerProphecy->reveal()); - $languageStore = $this->getMockBuilder(LanguageStore::class) ->onlyMethods(['hasData', 'setConfiguration', 'getData', 'setData']) ->getMock(); @@ -50,14 +39,16 @@ class LocalizationFactoryTest extends UnitTestCase ->onlyMethods(['get', 'set']) ->disableOriginalConstructor() ->getMock(); - $cacheManagerProphecy->getCache('l10n')->willReturn($cacheInstance); - $localizationFactory = new LocalizationFactory(); - $localizationFactory->store = $languageStore; $languageStore->method('hasData')->willReturn(false); $languageStore->method('getData')->willReturn(['default' => []]); $languageStore->method('setConfiguration')->willThrowException(new FileNotFoundException('testing', 1476049512)); $cacheInstance->method('get')->willReturn(false); + $cacheManagerProphecy = $this->prophesize(CacheManager::class); + $cacheManagerProphecy->getCache('l10n')->willReturn($cacheInstance); + + /** @var $localizationFactory LocalizationFactory */ + $localizationFactory = $this->getAccessibleMock(LocalizationFactory::class, ['localizationOverride'], [$languageStore, $cacheManagerProphecy->reveal()]); $GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride'] = ['foo' => 'bar']; $localizationFactory->getParsedData('EXT:backend/Resources/Private/Language/locallang_layout.xlf', 'default'); diff --git a/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php b/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php index 6f99e629244e7ffd97cc3222a60ec746262b757a..cc1af8e2b1e3e060a3a8b51835626e0966720ed9 100644 --- a/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php +++ b/typo3/sysext/core/Tests/Unit/Localization/Parser/XliffParserTest.php @@ -19,9 +19,9 @@ use Prophecy\Argument; use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Core\Environment; +use TYPO3\CMS\Core\Localization\LanguageStore; use TYPO3\CMS\Core\Localization\LocalizationFactory; use TYPO3\CMS\Core\Localization\Parser\XliffParser; -use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** @@ -34,6 +34,11 @@ class XliffParserTest extends UnitTestCase */ protected $xliffFileNames; + /** + * @var ObjectProphecy|CacheManager + */ + protected $cacheManagerProphecy; + /** * Prepares the environment before running a test. */ @@ -49,24 +54,15 @@ class XliffParserTest extends UnitTestCase ]; $GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['format']['priority'] = 'xlf'; - $cacheManagerProphecy = $this->prophesize(CacheManager::class); - GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManagerProphecy->reveal()); + $this->languageStoreProphecy = $this->prophesize(LanguageStore::class); + $this->cacheManagerProphecy = $this->prophesize(CacheManager::class); $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); - $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); + $this->cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); $cacheFrontendProphecy->flush()->willReturn(null); } - /** - * Cleans up the environment after running a test. - */ - protected function tearDown(): void - { - GeneralUtility::purgeInstances(); - parent::tearDown(); - } - /** * @test */ @@ -107,7 +103,7 @@ class XliffParserTest extends UnitTestCase public function canOverrideXliff() { /** @var $factory LocalizationFactory */ - $factory = new LocalizationFactory(); + $factory = new LocalizationFactory(new LanguageStore(), $this->cacheManagerProphecy->reveal()); $GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride'][$this->xliffFileNames['locallang']][] = $this->xliffFileNames['locallang_override']; $GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['fr'][$this->xliffFileNames['locallang']][] = $this->xliffFileNames['locallang_override_fr']; @@ -144,7 +140,7 @@ class XliffParserTest extends UnitTestCase */ public function canOverrideXliffWithFrenchOnly() { - $factory = new LocalizationFactory(); + $factory = new LocalizationFactory(new LanguageStore(), $this->cacheManagerProphecy->reveal()); $GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['fr'][$this->xliffFileNames['locallang']][] = $this->xliffFileNames['locallang_override_fr']; $LOCAL_LANG = $factory->getParsedData($this->xliffFileNames['locallang'], 'fr'); diff --git a/typo3/sysext/core/Tests/Unit/Utility/File/ExtendedFileUtilityTest.php b/typo3/sysext/core/Tests/Unit/Utility/File/ExtendedFileUtilityTest.php index 8e11f31461f500e170dc809513c851f51c07c84a..5acd37dc46567d152c478fa40e55d354c84b9c23 100644 --- a/typo3/sysext/core/Tests/Unit/Utility/File/ExtendedFileUtilityTest.php +++ b/typo3/sysext/core/Tests/Unit/Utility/File/ExtendedFileUtilityTest.php @@ -40,6 +40,7 @@ class ExtendedFileUtilityTest extends UnitTestCase { parent::setUp(); $GLOBALS['LANG'] = $this->getMockBuilder(LanguageService::class) + ->disableOriginalConstructor() ->setMethods(['sL']) ->getMock(); } diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Localization/LocalizationFactoryTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Localization/LocalizationFactoryTest.php index bd467937ba4c5075a767975e18612e5f04947b33..3f857ddc825820cf7f9b8ac105fc59303cb23088 100644 --- a/typo3/sysext/core/Tests/UnitDeprecated/Localization/LocalizationFactoryTest.php +++ b/typo3/sysext/core/Tests/UnitDeprecated/Localization/LocalizationFactoryTest.php @@ -45,13 +45,13 @@ class LocalizationFactoryTest extends UnitTestCase public function getParsedDataHandlesLocallangXMLOverride() { $cacheManagerProphecy = $this->prophesize(CacheManager::class); - GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManagerProphecy->reveal()); $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); - $subject = new LocalizationFactory(); + $store = new LanguageStore(); + $subject = new LocalizationFactory($store, $cacheManagerProphecy->reveal()); $unique = 'locallangXMLOverrideTest' . substr(StringUtility::getUniqueId(), 0, 10); $xml = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?> @@ -72,8 +72,6 @@ class LocalizationFactoryTest extends UnitTestCase // Set override file $GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['EXT:core/Resources/Private/Language/locallang_core.xlf'][$unique] = $file; - /** @var $store LanguageStore */ - $store = GeneralUtility::makeInstance(LanguageStore::class); $store->flushData('EXT:core/Resources/Private/Language/locallang_core.xlf'); // Get override value diff --git a/typo3/sysext/core/Tests/UnitDeprecated/Localization/Parser/LocallangXmlParserTest.php b/typo3/sysext/core/Tests/UnitDeprecated/Localization/Parser/LocallangXmlParserTest.php index ba188a7007fc5a3f25382b1efe4372c0e5c668da..81e27bc71a86827ae5d76827ab22b65d4389aabd 100644 --- a/typo3/sysext/core/Tests/UnitDeprecated/Localization/Parser/LocallangXmlParserTest.php +++ b/typo3/sysext/core/Tests/UnitDeprecated/Localization/Parser/LocallangXmlParserTest.php @@ -32,6 +32,11 @@ use TYPO3\TestingFramework\Core\Unit\UnitTestCase; */ class LocallangXmlParserTest extends UnitTestCase { + /** + * @var ObjectProphecy|CacheManager + */ + protected $cacheManagerProphecy; + /** * Prepares the environment before running a test. */ @@ -41,10 +46,9 @@ class LocallangXmlParserTest extends UnitTestCase $GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['format']['priority'] = 'xml'; $GLOBALS['TYPO3_CONF_VARS']['SYS']['lang']['parser']['xml'] = \TYPO3\CMS\Core\Localization\Parser\LocallangXmlParser::class; - $cacheManagerProphecy = $this->prophesize(CacheManager::class); - GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManagerProphecy->reveal()); + $this->cacheManagerProphecy = $this->prophesize(CacheManager::class); $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); - $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); + $this->cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); @@ -122,7 +126,7 @@ class LocallangXmlParserTest extends UnitTestCase public function canOverrideLlxml() { /** @var $factory LocalizationFactory */ - $factory = new LocalizationFactory(); + $factory = new LocalizationFactory(new LanguageStore(), $this->cacheManagerProphecy->reveal()); $GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride'][self::getFixtureFilePath('locallang.xml')][] = self::getFixtureFilePath('locallang_override.xml'); $LOCAL_LANG = array_merge( @@ -183,7 +187,7 @@ class LocallangXmlParserTest extends UnitTestCase public function canTranslateNumericKeys($key, $expectedResult) { /** @var $factory LocalizationFactory */ - $factory = new LocalizationFactory(); + $factory = new LocalizationFactory(new LanguageStore(), $this->cacheManagerProphecy->reveal()); $LOCAL_LANG = $factory->getParsedData(self::getFixtureFilePath('locallangNumericKeys.xml'), 'fr'); diff --git a/typo3/sysext/extbase/Classes/ServiceProvider.php b/typo3/sysext/extbase/Classes/ServiceProvider.php index 41f5cb1b9ab8b9348ef25dd1ba00a5f09d103cfc..28ec596e4cb0d4f76cd5ca62a2961c5752bbb15a 100644 --- a/typo3/sysext/extbase/Classes/ServiceProvider.php +++ b/typo3/sysext/extbase/Classes/ServiceProvider.php @@ -21,6 +21,7 @@ use Psr\Container\ContainerInterface; use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Log\LogManager; use TYPO3\CMS\Core\Package\AbstractServiceProvider; +use TYPO3\CMS\Core\TypoScript\TypoScriptService; /** * @internal @@ -38,6 +39,7 @@ class ServiceProvider extends AbstractServiceProvider Object\Container\Container::class => [ static::class, 'getObjectContainer' ], Object\ObjectManager::class => [ static::class, 'getObjectManager' ], SignalSlot\Dispatcher::class => [ static::class, 'getSignalSlotDispatcher' ], + Configuration\BackendConfigurationManager::class => [ static::class, 'getBackendConfigurationManager' ], Configuration\ConfigurationManager::class => [ static::class, 'getConfigurationManager' ], Reflection\ReflectionService::class => [ static::class, 'getReflectionService' ], Service\EnvironmentService::class => [ static::class, 'getEnvironmentService' ], @@ -62,6 +64,15 @@ class ServiceProvider extends AbstractServiceProvider return self::new($container, SignalSlot\Dispatcher::class, [$container->get(Object\ObjectManager::class), $logger]); } + public static function getBackendConfigurationManager(ContainerInterface $container): Configuration\BackendConfigurationManager + { + return self::new($container, Configuration\BackendConfigurationManager::class, [ + $container->get(Object\ObjectManager::class), + $container->get(TypoScriptService::class), + $container->get(Service\EnvironmentService::class), + ]); + } + public static function getConfigurationManager(ContainerInterface $container): Configuration\ConfigurationManager { return self::new($container, Configuration\ConfigurationManager::class, [ diff --git a/typo3/sysext/extbase/Tests/Functional/Mvc/Validation/ActionControllerValidationTest.php b/typo3/sysext/extbase/Tests/Functional/Mvc/Validation/ActionControllerValidationTest.php index daf8bead47decf7d8d086afb0c7b49cd1c497cf9..5b2a6b4668781effc3c560325ce465e8957dbdb6 100644 --- a/typo3/sysext/extbase/Tests/Functional/Mvc/Validation/ActionControllerValidationTest.php +++ b/typo3/sysext/extbase/Tests/Functional/Mvc/Validation/ActionControllerValidationTest.php @@ -67,7 +67,7 @@ class ActionControllerValidationTest extends FunctionalTestCase */ public function forwardedActionValidatesPreviouslyIgnoredArgument(array $blogPostArgument, array $trustedProperties, array $expectedErrorCodes) { - $GLOBALS['LANG'] = new LanguageService(); + $GLOBALS['LANG'] = GeneralUtility::getContainer()->get(LanguageService::class); $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'testkey'; $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/pages.xml'); @@ -115,7 +115,7 @@ class ActionControllerValidationTest extends FunctionalTestCase */ public function validationResultsAreProvidedForTheSameObjectInDifferentArguments() { - $GLOBALS['LANG'] = new LanguageService(); + $GLOBALS['LANG'] = GeneralUtility::getContainer()->get(LanguageService::class); $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'testkey'; $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/pages.xml'); diff --git a/typo3/sysext/extbase/Tests/Unit/Utility/LocalizationUtilityTest.php b/typo3/sysext/extbase/Tests/Unit/Utility/LocalizationUtilityTest.php index 0edd4873207563f11de587fc8208663c43abd80f..aa9e263c8b0546168ba8b60de963a7d546034112 100644 --- a/typo3/sysext/extbase/Tests/Unit/Utility/LocalizationUtilityTest.php +++ b/typo3/sysext/extbase/Tests/Unit/Utility/LocalizationUtilityTest.php @@ -17,7 +17,11 @@ namespace TYPO3\CMS\Extbase\Tests\Unit\Utility; use Prophecy\Argument; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Cache\CacheManager; +use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Localization\LanguageStore; +use TYPO3\CMS\Core\Localization\Locales; use TYPO3\CMS\Core\Localization\LocalizationFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface; @@ -343,7 +347,12 @@ class LocalizationUtilityTest extends UnitTestCase $property = $reflectionClass->getProperty('LOCAL_LANG'); $property->setAccessible(true); $property->setValue($this->LOCAL_LANG); - $GLOBALS['LANG'] = new LanguageService(); + $cacheManagerProphecy = $this->prophesize(CacheManager::class); + $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); + $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); + $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); + $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); + $GLOBALS['LANG'] = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManagerProphecy->reveal())); self::assertEquals($expected, LocalizationUtility::translate($key, 'core', $arguments, $languageKey, $altLanguageKeys)); } @@ -503,7 +512,12 @@ class LocalizationUtilityTest extends UnitTestCase $method->setAccessible(true); $method->invoke(null, 'core', $this->languageFilePath); - $GLOBALS['LANG'] = new LanguageService(); + $cacheManagerProphecy = $this->prophesize(CacheManager::class); + $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); + $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); + $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); + $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); + $GLOBALS['LANG'] = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManagerProphecy->reveal())); $result = LocalizationUtility::translate('key1', 'core', null, 'dk'); self::assertNotNull($result); @@ -545,7 +559,12 @@ class LocalizationUtilityTest extends UnitTestCase $method->setAccessible(true); $method->invoke(null, 'core', ''); // setting the language file path to an empty string here - $GLOBALS['LANG'] = new LanguageService(); + $cacheManagerProphecy = $this->prophesize(CacheManager::class); + $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); + $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); + $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); + $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); + $GLOBALS['LANG'] = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManagerProphecy->reveal())); $result = LocalizationUtility::translate('key1', 'core', null, 'dk'); self::assertNotNull($result); diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php index 76e09085226beecba2ca8868a97e94cfad528d1d..fd9af2fb7e77e278c760d2497dc03334852ee757 100644 --- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php +++ b/typo3/sysext/extensionmanager/Tests/Unit/Utility/FileHandlingUtilityTest.php @@ -149,7 +149,7 @@ class FileHandlingUtilityTest extends UnitTestCase $this->expectException(ExtensionManagerException::class); $this->expectExceptionCode(1337280417); $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory']); - $languageServiceMock = $this->getMockBuilder(LanguageService::class)->getMock(); + $languageServiceMock = $this->getMockBuilder(LanguageService::class)->disableOriginalConstructor()->getMock(); $fileHandlerMock->_set('languageService', $languageServiceMock); $fileHandlerMock->_call('makeAndClearExtensionDir', 'testing123', 'fakepath'); } diff --git a/typo3/sysext/form/Tests/Unit/Service/TranslationServiceTest.php b/typo3/sysext/form/Tests/Unit/Service/TranslationServiceTest.php index a0883a59b09ab45e594726931dba4c51f726061d..7c820152570d6102c4460a0123d1e335510ad866 100644 --- a/typo3/sysext/form/Tests/Unit/Service/TranslationServiceTest.php +++ b/typo3/sysext/form/Tests/Unit/Service/TranslationServiceTest.php @@ -22,6 +22,7 @@ use TYPO3\CMS\Core\Cache\CacheManager; use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Localization\LanguageService; use TYPO3\CMS\Core\Localization\LanguageStore; +use TYPO3\CMS\Core\Localization\Locales; use TYPO3\CMS\Core\Localization\LocalizationFactory; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Configuration\ConfigurationManager; @@ -102,10 +103,11 @@ class TranslationServiceTest extends UnitTestCase 'getLanguageService' ], [], '', false); + $languageService = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManagerProphecy->reveal())); $this->mockTranslationService ->expects(self::any()) ->method('getLanguageService') - ->willReturn(GeneralUtility::makeInstance(LanguageService::class)); + ->willReturn($languageService); $this->mockTranslationService ->expects(self::any()) diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php index c3f9218f50059d988310bc37a91e80f2b59df34a..e5020f6b16619a925976ad755d92d0ce8264c07c 100644 --- a/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php +++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/Menu/AbstractMenuContentObjectTest.php @@ -19,6 +19,8 @@ namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject\Menu; use Doctrine\DBAL\Driver\Statement; use Prophecy\Argument; +use TYPO3\CMS\Core\Cache\CacheManager; +use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend; use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Context\LanguageAspect; @@ -27,6 +29,11 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Expression\ExpressionBuilder; use TYPO3\CMS\Core\Domain\Repository\PageRepository; use TYPO3\CMS\Core\Http\ServerRequest; +use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Localization\LanguageServiceFactory; +use TYPO3\CMS\Core\Localization\LanguageStore; +use TYPO3\CMS\Core\Localization\Locales; +use TYPO3\CMS\Core\Localization\LocalizationFactory; use TYPO3\CMS\Core\Routing\PageArguments; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -64,6 +71,16 @@ class AbstractMenuContentObjectTest extends UnitTestCase ] ] ]); + $cacheManagerProphecy = $this->prophesize(CacheManager::class); + GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManagerProphecy->reveal()); + $cacheFrontendProphecy = $this->prophesize(FrontendInterface::class); + $cacheManagerProphecy->getCache('l10n')->willReturn($cacheFrontendProphecy->reveal()); + $cacheFrontendProphecy->get(Argument::cetera())->willReturn(false); + $cacheFrontendProphecy->set(Argument::cetera())->willReturn(null); + $languageService = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManagerProphecy->reveal())); + $languageServiceFactoryProphecy = $this->prophesize(LanguageServiceFactory::class); + $languageServiceFactoryProphecy->create(Argument::any())->willReturn($languageService); + GeneralUtility::addInstance(LanguageServiceFactory::class, $languageServiceFactoryProphecy->reveal()); $GLOBALS['TSFE'] = $this->getMockBuilder(TypoScriptFrontendController::class) ->setConstructorArgs([new Context(), $site, $site->getDefaultLanguage(), new PageArguments(1, '1', [])]) ->setMethods(['initCaches']) diff --git a/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php b/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php index c4dadc9d6cc12e3b8b70d24347c5281173f72fda..871d8aa10ffec2f80d2a75ae5069a66b6f728348 100644 --- a/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php +++ b/typo3/sysext/frontend/Tests/Unit/Controller/ErrorControllerTest.php @@ -18,6 +18,8 @@ declare(strict_types=1); namespace TYPO3\CMS\Frontend\Tests\Unit\Controller; use TYPO3\CMS\Core\Http\ServerRequest; +use TYPO3\CMS\Core\Information\Typo3Information; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Frontend\Controller\ErrorController; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; @@ -33,6 +35,9 @@ class ErrorControllerTest extends UnitTestCase */ public function pageNotFoundHandlingThrowsExceptionIfNotConfigured() { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $GLOBALS['TYPO3_REQUEST'] = []; $subject = new ErrorController(); $response = $subject->pageNotFoundAction(new ServerRequest(), 'This test page was not found!'); @@ -72,6 +77,9 @@ class ErrorControllerTest extends UnitTestCase */ public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForPageNotFoundAction() { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $subject = new ErrorController(); $response = $subject->pageNotFoundAction(new ServerRequest(), 'Error handler is not configured.'); self::assertSame(404, $response->getStatusCode()); @@ -97,6 +105,9 @@ class ErrorControllerTest extends UnitTestCase */ public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForUnavailableAction() { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $subject = new ErrorController(); $response = $subject->unavailableAction(new ServerRequest(), 'Error handler is not configured.'); self::assertSame(500, $response->getStatusCode()); @@ -122,6 +133,9 @@ class ErrorControllerTest extends UnitTestCase */ public function defaultErrorHandlerWithHtmlResponseIsChosenWhenNoSiteConfiguredForAccessDeniedAction() { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $subject = new ErrorController(); $response = $subject->accessDeniedAction(new ServerRequest(), 'Error handler is not configured.'); self::assertSame(403, $response->getStatusCode()); diff --git a/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php b/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php index b514a675a422ec7ff2d2cc2bc1c7f5c634d9df52..851341bd3bb45cdeb720f43c01006cc707728a2b 100644 --- a/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php +++ b/typo3/sysext/frontend/Tests/Unit/Controller/TypoScriptFrontendControllerTest.php @@ -17,6 +17,7 @@ declare(strict_types=1); namespace TYPO3\CMS\Frontend\Tests\Unit\Controller; +use Prophecy\Argument; use Psr\Container\ContainerInterface; use TYPO3\CMS\Core\Cache\Backend\NullBackend; use TYPO3\CMS\Core\Cache\CacheManager; @@ -26,6 +27,11 @@ use TYPO3\CMS\Core\EventDispatcher\EventDispatcher; use TYPO3\CMS\Core\EventDispatcher\ListenerProvider; use TYPO3\CMS\Core\Http\ServerRequest; use TYPO3\CMS\Core\Http\ServerRequestFactory; +use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Localization\LanguageServiceFactory; +use TYPO3\CMS\Core\Localization\LanguageStore; +use TYPO3\CMS\Core\Localization\Locales; +use TYPO3\CMS\Core\Localization\LocalizationFactory; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\PageTitle\PageTitleProviderManager; use TYPO3\CMS\Core\Routing\PageArguments; @@ -141,6 +147,16 @@ class TypoScriptFrontendControllerTest extends UnitTestCase */ public function localizationReturnsUnchangedStringIfNotLocallangLabel() { + $nullCacheBackend = new NullBackend(''); + $cacheManager = $this->prophesize(CacheManager::class); + $cacheManager->getCache('l10n')->willReturn($nullCacheBackend); + $languageService = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManager->reveal())); + $languageServiceFactoryProphecy = $this->prophesize(LanguageServiceFactory::class); + $languageServiceFactoryProphecy->create(Argument::any())->will(function ($args) use ($languageService) { + $languageService->init($args[0]); + return $languageService; + }); + GeneralUtility::addInstance(LanguageServiceFactory::class, $languageServiceFactoryProphecy->reveal()); $string = StringUtility::getUniqueId(); $site = $this->createSiteWithDefaultLanguage([ 'locale' => 'fr', @@ -531,12 +547,20 @@ class TypoScriptFrontendControllerTest extends UnitTestCase $nullCacheBackend = new NullBackend(''); $cacheManager = $this->prophesize(CacheManager::class); $cacheManager->getCache('pages')->willReturn($nullCacheBackend); + $cacheManager->getCache('l10n')->willReturn($nullCacheBackend); GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManager->reveal()); $GLOBALS['TYPO3_REQUEST'] = new ServerRequest('https://www.example.com/'); $site = $this->createSiteWithDefaultLanguage([ 'locale' => 'fr', 'typo3Language' => 'fr-test', ]); + $languageService = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManager->reveal())); + $languageServiceFactoryProphecy = $this->prophesize(LanguageServiceFactory::class); + $languageServiceFactoryProphecy->create(Argument::any())->will(function ($args) use ($languageService) { + $languageService->init($args[0]); + return $languageService; + }); + GeneralUtility::addInstance(LanguageServiceFactory::class, $languageServiceFactoryProphecy->reveal()); // Constructor calling initPageRenderer() new TypoScriptFrontendController( new Context(), @@ -556,12 +580,20 @@ class TypoScriptFrontendControllerTest extends UnitTestCase $nullCacheBackend = new NullBackend(''); $cacheManager = $this->prophesize(CacheManager::class); $cacheManager->getCache('pages')->willReturn($nullCacheBackend); + $cacheManager->getCache('l10n')->willReturn($nullCacheBackend); GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManager->reveal()); $GLOBALS['TYPO3_REQUEST'] = new ServerRequest('https://www.example.com/'); $site = $this->createSiteWithDefaultLanguage([ 'locale' => 'fr', 'typo3Language' => 'fr', ]); + $languageService = new LanguageService(new Locales(), new LocalizationFactory(new LanguageStore(), $cacheManager->reveal())); + $languageServiceFactoryProphecy = $this->prophesize(LanguageServiceFactory::class); + $languageServiceFactoryProphecy->create(Argument::any())->will(function ($args) use ($languageService) { + $languageService->init($args[0]); + return $languageService; + }); + GeneralUtility::addInstance(LanguageServiceFactory::class, $languageServiceFactoryProphecy->reveal()); // Constructor calling setOutputLanguage() $subject = $this->getAccessibleMock( TypoScriptFrontendController::class, diff --git a/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php b/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php index fb5b08e1e36875033d45846547f3254d58250f87..85186218c6a44a280a911037b1aebbd309b9d04b 100644 --- a/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php +++ b/typo3/sysext/frontend/Tests/Unit/Http/RequestHandlerTest.php @@ -21,6 +21,7 @@ use Prophecy\Argument; use Psr\EventDispatcher\EventDispatcherInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Http\ServerRequestFactory; +use TYPO3\CMS\Core\Information\Typo3Information; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\TimeTracker\TimeTracker; @@ -250,6 +251,9 @@ class RequestHandlerTest extends UnitTestCase $tsfe->pSetup = [ 'meta.' => $typoScript ]; + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getInlineHeaderComment()->willReturn('dummy'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $pageRendererProphecy = $this->prophesize(PageRenderer::class); $subject = $this->getAccessibleMock(RequestHandler::class, ['getPageRenderer'], [], '', false); @@ -292,6 +296,10 @@ class RequestHandlerTest extends UnitTestCase $tsfe->pSetup = [ 'meta.' => $typoScript ]; + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getInlineHeaderComment()->willReturn('dummy'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); + $pageRendererProphecy = $this->prophesize(PageRenderer::class); $subject = $this->getAccessibleMock(RequestHandler::class, ['getPageRenderer'], [], '', false); $requestProphecy = $this->prophesize(ServerRequestInterface::class)->reveal(); @@ -335,6 +343,9 @@ class RequestHandlerTest extends UnitTestCase $tsfe->pSetup = [ 'meta.' => $typoScript ]; + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getInlineHeaderComment()->willReturn('dummy'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $pageRendererProphecy = $this->prophesize(PageRenderer::class); $subject = $this->getAccessibleMock(RequestHandler::class, ['getPageRenderer'], [], '', false); @@ -434,6 +445,10 @@ class RequestHandlerTest extends UnitTestCase $tsfe->pSetup = [ 'meta.' => $typoScript ]; + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getInlineHeaderComment()->willReturn('This website is...'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); + $pageRendererProphecy = $this->prophesize(PageRenderer::class); $subject = $this->getAccessibleMock(RequestHandler::class, ['getPageRenderer'], [], '', false); $subject->expects(self::any())->method('getPageRenderer')->willReturn($pageRendererProphecy->reveal()); diff --git a/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php b/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php index da0925d6848f7415ecb7d89bdf5ad263f945de94..119ccdc24f45db820b267d4355213aab7cd907e8 100644 --- a/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php +++ b/typo3/sysext/frontend/Tests/Unit/Middleware/PageArgumentValidatorTest.php @@ -23,8 +23,10 @@ use Psr\Http\Server\RequestHandlerInterface; use Psr\Log\NullLogger; use TYPO3\CMS\Core\Http\Response; use TYPO3\CMS\Core\Http\ServerRequest; +use TYPO3\CMS\Core\Information\Typo3Information; use TYPO3\CMS\Core\Routing\PageArguments; use TYPO3\CMS\Core\TimeTracker\TimeTracker; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Frontend\Middleware\PageArgumentValidator; use TYPO3\CMS\Frontend\Middleware\PageResolver; use TYPO3\CMS\Frontend\Page\CacheHashCalculator; @@ -104,6 +106,10 @@ class PageArgumentValidatorTest extends UnitTestCase $request = $request->withAttribute('routing', $pageArguments); $subject = new PageArgumentValidator($this->cacheHashCalculator, $this->timeTrackerStub); + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); + $response = $subject->process($request, $this->responseOutputHandler); self::assertEquals(404, $response->getStatusCode()); } @@ -117,6 +123,9 @@ class PageArgumentValidatorTest extends UnitTestCase $request = new ServerRequest($incomingUrl, 'GET'); $subject = new PageArgumentValidator($this->cacheHashCalculator, $this->timeTrackerStub); + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $response = $subject->process($request, $this->responseOutputHandler); self::assertEquals(404, $response->getStatusCode()); } @@ -151,6 +160,9 @@ class PageArgumentValidatorTest extends UnitTestCase $request = $request->withAttribute('routing', $pageArguments); $subject = new PageArgumentValidator($this->cacheHashCalculator, $this->timeTrackerStub); + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); $response = $subject->process($request, $this->responseOutputHandler); self::assertEquals(404, $response->getStatusCode()); } diff --git a/typo3/sysext/frontend/Tests/UnitDeprecated/Controller/TypoScriptFrontendControllerTest.php b/typo3/sysext/frontend/Tests/UnitDeprecated/Controller/TypoScriptFrontendControllerTest.php index f73a2a4babc0c15ae0e58da1c47b622fa09c761e..52101d3f8213623186e8124019ff0eb5475dd7c9 100644 --- a/typo3/sysext/frontend/Tests/UnitDeprecated/Controller/TypoScriptFrontendControllerTest.php +++ b/typo3/sysext/frontend/Tests/UnitDeprecated/Controller/TypoScriptFrontendControllerTest.php @@ -21,8 +21,10 @@ use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Domain\Repository\PageRepository; use TYPO3\CMS\Core\Http\ImmediateResponseException; use TYPO3\CMS\Core\Http\ServerRequest; +use TYPO3\CMS\Core\Information\Typo3Information; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\Routing\PageArguments; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; @@ -127,6 +129,9 @@ class TypoScriptFrontendControllerTest extends UnitTestCase $this->subject->_set('pageArguments', new PageArguments(1, '0', ['tx_test' => 1], ['tx_test' => 1], $remainingArguments)); if ($expected) { + $typo3InformationProphecy = $this->prophesize(Typo3Information::class); + $typo3InformationProphecy->getCopyrightYear()->willReturn('1999-20XX'); + GeneralUtility::addInstance(Typo3Information::class, $typo3InformationProphecy->reveal()); static::expectException(ImmediateResponseException::class); } $this->subject->reqCHash(); diff --git a/typo3/sysext/install/Classes/Command/UpgradeWizardListCommand.php b/typo3/sysext/install/Classes/Command/UpgradeWizardListCommand.php index 3409cf5a2858c57cb57db94e5acf23b72728b68d..f3e1089accad61da54c6adc6cf0f2d7dcb207072 100644 --- a/typo3/sysext/install/Classes/Command/UpgradeWizardListCommand.php +++ b/typo3/sysext/install/Classes/Command/UpgradeWizardListCommand.php @@ -37,6 +37,11 @@ use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; */ class UpgradeWizardListCommand extends Command { + /** + * @var LateBootService + */ + private $lateBootService; + /** * @var UpgradeWizardsService */ @@ -52,12 +57,22 @@ class UpgradeWizardListCommand extends Command */ private $input; + public function __construct( + string $name, + LateBootService $lateBootService, + UpgradeWizardsService $upgradeWizardsService + ) { + $this->lateBootService = $lateBootService; + $this->upgradeWizardsService = $upgradeWizardsService; + parent::__construct($name); + } + /** * Bootstrap running of upgradeWizards */ protected function bootstrap(): void { - GeneralUtility::makeInstance(LateBootService::class)->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); Bootstrap::initializeBackendUser(CommandLineUserAuthentication::class); Bootstrap::initializeBackendAuthentication(); } @@ -88,7 +103,6 @@ class UpgradeWizardListCommand extends Command $this->output = new SymfonyStyle($input, $output); $this->input = $input; $this->bootstrap(); - $this->upgradeWizardsService = new UpgradeWizardsService(); $result = 0; $wizards = []; diff --git a/typo3/sysext/install/Classes/Command/UpgradeWizardRunCommand.php b/typo3/sysext/install/Classes/Command/UpgradeWizardRunCommand.php index 7f03b5c25feaf272ebddb36c9cacf3ba786e1543..709a8a311fa8fa14340450c71af2e5556b84ea27 100644 --- a/typo3/sysext/install/Classes/Command/UpgradeWizardRunCommand.php +++ b/typo3/sysext/install/Classes/Command/UpgradeWizardRunCommand.php @@ -41,6 +41,11 @@ use TYPO3\CMS\Install\Updates\UpgradeWizardInterface; */ class UpgradeWizardRunCommand extends Command { + /** + * @var LateBootService + */ + private $lateBootService; + /** * @var UpgradeWizardsService */ @@ -56,16 +61,25 @@ class UpgradeWizardRunCommand extends Command */ private $input; + public function __construct( + string $name, + LateBootService $lateBootService, + UpgradeWizardsService $upgradeWizardsService + ) { + $this->lateBootService = $lateBootService; + $this->upgradeWizardsService = $upgradeWizardsService; + parent::__construct($name); + } + /** * Bootstrap running of upgrade wizard, * ensure database is utf-8 */ protected function bootstrap(): void { - GeneralUtility::makeInstance(LateBootService::class)->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); Bootstrap::initializeBackendUser(CommandLineUserAuthentication::class); Bootstrap::initializeBackendAuthentication(); - $this->upgradeWizardsService = new UpgradeWizardsService(); $this->upgradeWizardsService->isDatabaseCharsetUtf8() ?: $this->upgradeWizardsService->setDatabaseCharsetUtf8(); } diff --git a/typo3/sysext/install/Classes/Controller/AbstractController.php b/typo3/sysext/install/Classes/Controller/AbstractController.php index 2c182a5d836dced607ed5bea4d420d8b7fb57516..6638d8bb3f86ce933e8f4a069205cbcac6d7fecc 100644 --- a/typo3/sysext/install/Classes/Controller/AbstractController.php +++ b/typo3/sysext/install/Classes/Controller/AbstractController.php @@ -17,13 +17,11 @@ declare(strict_types=1); namespace TYPO3\CMS\Install\Controller; -use Psr\Container\ContainerInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Information\Typo3Version; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; -use TYPO3\CMS\Install\Service\LateBootService; /** * Controller abstract for shared parts of the install tool @@ -55,24 +53,4 @@ class AbstractController ]); return $view; } - - /** - * Some actions like the database analyzer and the upgrade wizards need additional - * bootstrap actions performed. - * - * Those actions can potentially fatal if some old extension is loaded that triggers - * a fatal in ext_localconf or ext_tables code! Use only if really needed. - * - * @param bool $resetContainer - * @return ContainerInterface - */ - public function loadExtLocalconfDatabaseAndExtTables(bool $resetContainer = true): ContainerInterface - { - return GeneralUtility::makeInstance(LateBootService::class)->loadExtLocalconfDatabaseAndExtTables($resetContainer); - } - - public function resetGlobalContainer(): void - { - GeneralUtility::makeInstance(LateBootService::class)->makeCurrent(null, []); - } } diff --git a/typo3/sysext/install/Classes/Controller/IconController.php b/typo3/sysext/install/Classes/Controller/IconController.php index ade8f76f91928609594a46b09ef23dfa3ffd0a65..9ed9c7d527100f0c4369215dc06b530251bc644e 100644 --- a/typo3/sysext/install/Classes/Controller/IconController.php +++ b/typo3/sysext/install/Classes/Controller/IconController.php @@ -23,7 +23,6 @@ use TYPO3\CMS\Core\Http\HtmlResponse; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Imaging\IconRegistry; use TYPO3\CMS\Core\Type\Icon\IconState; -use TYPO3\CMS\Core\Utility\GeneralUtility; /** * Controller for icon handling @@ -41,13 +40,10 @@ class IconController extends AbstractController */ protected $iconFactory; - /** - * Set up dependencies - */ - public function __construct() + public function __construct(IconRegistry $iconRegistry, IconFactory $iconFactory) { - $this->iconRegistry = GeneralUtility::makeInstance(IconRegistry::class); - $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class); + $this->iconRegistry = $iconRegistry; + $this->iconFactory = $iconFactory; } /** diff --git a/typo3/sysext/install/Classes/Controller/InstallerController.php b/typo3/sysext/install/Classes/Controller/InstallerController.php index 95fa3f4957f3ba9b7e4b4c2456916baa9425e4de..1f65e6616ec6fa9ca9e4610d671500a5bb0a36c2 100644 --- a/typo3/sysext/install/Classes/Controller/InstallerController.php +++ b/typo3/sysext/install/Classes/Controller/InstallerController.php @@ -19,7 +19,6 @@ namespace TYPO3\CMS\Install\Controller; use Doctrine\DBAL\DBALException; use Doctrine\DBAL\DriverManager; -use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Configuration\ConfigurationManager; @@ -49,7 +48,6 @@ use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageQueue; use TYPO3\CMS\Core\Package\FailsafePackageManager; use TYPO3\CMS\Core\Package\PackageInterface; -use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Registry; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Fluid\View\StandaloneView; @@ -70,6 +68,52 @@ use TYPO3\CMS\Install\SystemEnvironment\SetupCheck; */ class InstallerController { + /** + * @var LateBootService + */ + private $lateBootService; + + /** + * @var SilentConfigurationUpgradeService + */ + private $silentConfigurationUpgradeService; + + /** + * @var ConfigurationManager + */ + private $configurationManager; + + /** + * @var SiteConfiguration + */ + private $siteConfiguration; + + /** + * @var Registry + */ + private $registry; + + /** + * @var FailsafePackageManager + */ + private $packageManager; + + public function __construct( + LateBootService $lateBootService, + SilentConfigurationUpgradeService $silentConfigurationUpgradeService, + ConfigurationManager $configurationManager, + SiteConfiguration $siteConfiguration, + Registry $registry, + FailsafePackageManager $packageManager + ) { + $this->lateBootService = $lateBootService; + $this->silentConfigurationUpgradeService = $silentConfigurationUpgradeService; + $this->configurationManager = $configurationManager; + $this->siteConfiguration = $siteConfiguration; + $this->registry = $registry; + $this->packageManager = $packageManager; + } + /** * Init action loads <head> with JS initiating further stuff * @@ -129,7 +173,7 @@ class InstallerController public function checkEnvironmentAndFoldersAction(): ResponseInterface { return new JsonResponse([ - 'success' => @is_file(GeneralUtility::makeInstance(ConfigurationManager::class)->getLocalConfigurationFileLocation()), + 'success' => @is_file($this->configurationManager->getLocalConfigurationFileLocation()), ]); } @@ -175,22 +219,19 @@ class InstallerController $errorsFromStructure = $structureFixMessageQueue->getAllMessages(FlashMessage::ERROR); if (@is_dir(Environment::getLegacyConfigPath())) { - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); - $configurationManager->createLocalConfigurationFromFactoryConfiguration(); + $this->configurationManager->createLocalConfigurationFromFactoryConfiguration(); // Create a PackageStates.php with all packages activated marked as "part of factory default" if (!file_exists(Environment::getLegacyConfigPath() . '/PackageStates.php')) { - /** @var FailsafePackageManager $packageManager */ - $packageManager = GeneralUtility::makeInstance(PackageManager::class); - $packages = $packageManager->getAvailablePackages(); + $packages = $this->packageManager->getAvailablePackages(); foreach ($packages as $package) { if ($package instanceof PackageInterface && $package->isPartOfFactoryDefault() ) { - $packageManager->activatePackage($package->getPackageKey()); + $this->packageManager->activatePackage($package->getPackageKey()); } } - $packageManager->forceSortAndSavePackageStates(); + $this->packageManager->forceSortAndSavePackageStates(); } $extensionConfiguration = new ExtensionConfiguration(); $extensionConfiguration->synchronizeExtConfTemplateWithLocalConfigurationOfAllExtensions(); @@ -225,8 +266,7 @@ class InstallerController public function executeAdjustTrustedHostsPatternAction(): ResponseInterface { if (!GeneralUtility::hostHeaderValueMatchesTrustedHostsPattern($_SERVER['HTTP_HOST'])) { - $configurationManager = new ConfigurationManager(); - $configurationManager->setLocalConfigurationValueByPath('SYS/trustedHostsPattern', '.*'); + $this->configurationManager->setLocalConfigurationValueByPath('SYS/trustedHostsPattern', '.*'); } return new JsonResponse([ 'success' => true, @@ -240,10 +280,9 @@ class InstallerController */ public function executeSilentConfigurationUpdateAction(): ResponseInterface { - $silentUpdate = new SilentConfigurationUpgradeService(); $success = true; try { - $silentUpdate->execute(); + $this->silentConfigurationUpgradeService->execute(); } catch (ConfigurationChangedException $e) { $success = false; } @@ -529,11 +568,10 @@ class InstallerController foreach ($defaultConnectionSettings as $settingsName => $value) { $localConfigurationPathValuePairs['DB/Connections/Default/' . $settingsName] = $value; } - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); // Remove full default connection array - $configurationManager->removeLocalConfigurationKeysByPath(['DB/Connections/Default']); + $this->configurationManager->removeLocalConfigurationKeysByPath(['DB/Connections/Default']); // Write new values - $configurationManager->setLocalConfigurationValuesByPathValuePairs($localConfigurationPathValuePairs); + $this->configurationManager->setLocalConfigurationValuesByPathValuePairs($localConfigurationPathValuePairs); } return new JsonResponse([ @@ -635,8 +673,7 @@ class InstallerController ->dropDatabase($databaseName); } - GeneralUtility::makeInstance(ConfigurationManager::class) - ->removeLocalConfigurationKeysByPath(['DB/Connections/Default/dbname']); + $this->configurationManager->removeLocalConfigurationKeysByPath(['DB/Connections/Default/dbname']); $message = new FlashMessage( sprintf( @@ -783,7 +820,6 @@ class InstallerController public function executeDatabaseDataAction(ServerRequestInterface $request): ResponseInterface { $messages = []; - $configurationManager = new ConfigurationManager(); $postValues = $request->getParsedBody()['install']['values']; $username = (string)$postValues['username'] !== '' ? $postValues['username'] : 'admin'; // Check password and return early if not good enough @@ -803,7 +839,7 @@ class InstallerController } // Set site name if (!empty($postValues['sitename'])) { - $configurationManager->setLocalConfigurationValueByPath('SYS/sitename', $postValues['sitename']); + $this->configurationManager->setLocalConfigurationValueByPath('SYS/sitename', $postValues['sitename']); } try { $messages = $this->importDatabaseData(); @@ -850,7 +886,7 @@ class InstallerController ]); } // Set password as install tool password, add admin user to system maintainers - $configurationManager->setLocalConfigurationValuesByPathValuePairs([ + $this->configurationManager->setLocalConfigurationValuesByPathValuePairs([ 'BE/installToolPassword' => $this->getHashedPassword($password), 'SYS/systemMaintainers' => [$adminUserUid] ]); @@ -974,16 +1010,14 @@ For each website you need a TypoScript template on the main page of your website } // Mark upgrade wizards as done - $this->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); if (!empty($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'])) { - $registry = GeneralUtility::makeInstance(Registry::class); foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/install']['update'] as $updateClassName) { - $registry->set('installUpdate', $updateClassName, 1); + $this->registry->set('installUpdate', $updateClassName, 1); } } - $configurationManager = new ConfigurationManager(); - $configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationValues); + $this->configurationManager->setLocalConfigurationValuesByPathValuePairs($configurationValues); $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); $formProtection->clean(); @@ -1179,7 +1213,7 @@ For each website you need a TypoScript template on the main page of your website GeneralUtility::makeInstance(ConnectionPool::class) ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME) ->exec(PlatformInformation::getDatabaseCreateStatementWithCharset($platform, $dbName)); - GeneralUtility::makeInstance(ConfigurationManager::class) + $this->configurationManager ->setLocalConfigurationValueByPath('DB/Connections/Default/dbname', $dbName); } catch (DBALException $e) { return new FlashMessage( @@ -1209,7 +1243,6 @@ For each website you need a TypoScript template on the main page of your website { $result = new FlashMessage(''); $localConfigurationPathValuePairs = []; - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); $GLOBALS['TYPO3_CONF_VARS']['DB']['Connections'][ConnectionPool::DEFAULT_CONNECTION_NAME]['dbname'] = $dbName; try { @@ -1238,7 +1271,7 @@ For each website you need a TypoScript template on the main page of your website } if ($result->getSeverity() === FlashMessage::OK && !empty($localConfigurationPathValuePairs)) { - $configurationManager->setLocalConfigurationValuesByPathValuePairs($localConfigurationPathValuePairs); + $this->configurationManager->setLocalConfigurationValuesByPathValuePairs($localConfigurationPathValuePairs); } return $result; @@ -1285,7 +1318,7 @@ For each website you need a TypoScript template on the main page of your website // Will load ext_localconf and ext_tables. This is pretty safe here since we are // in first install (database empty), so it is very likely that no extension is loaded // that could trigger a fatal at this point. - $container = $this->loadExtLocalconfDatabaseAndExtTables(); + $container = $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); $sqlReader = $container->get(SqlReader::class); $sqlCode = $sqlReader->getTablesDefinitionString(true); @@ -1313,20 +1346,6 @@ For each website you need a TypoScript template on the main page of your website return array_values($results); } - /** - * Some actions like the database analyzer and the upgrade wizards need additional - * bootstrap actions performed. - * - * Those actions can potentially fatal if some old extension is loaded that triggers - * a fatal in ext_localconf or ext_tables code! Use only if really needed. - * - * @return ContainerInterface - */ - protected function loadExtLocalconfDatabaseAndExtTables(): ContainerInterface - { - return GeneralUtility::makeInstance(LateBootService::class)->loadExtLocalconfDatabaseAndExtTables(); - } - /** * Creates a site configuration with one language "English" which is the de-facto default language for TYPO3 in general. * @@ -1343,10 +1362,6 @@ For each website you need a TypoScript template on the main page of your website } // Create a default site configuration called "main" as best practice - $siteConfiguration = GeneralUtility::makeInstance( - SiteConfiguration::class, - Environment::getConfigPath() . '/sites' - ); - $siteConfiguration->createNewBasicSite($identifier, $rootPageId, $normalizedParams->getSiteUrl()); + $this->siteConfiguration->createNewBasicSite($identifier, $rootPageId, $normalizedParams->getSiteUrl()); } } diff --git a/typo3/sysext/install/Classes/Controller/LayoutController.php b/typo3/sysext/install/Classes/Controller/LayoutController.php index bb9951cd8fcd1027404e41cecb19b9917993f9c6..6a6af4cb24c9788b2a226970ec10bc751d3ff42c 100644 --- a/typo3/sysext/install/Classes/Controller/LayoutController.php +++ b/typo3/sysext/install/Classes/Controller/LayoutController.php @@ -37,6 +37,17 @@ use TYPO3\CMS\Install\Service\SilentConfigurationUpgradeService; */ class LayoutController extends AbstractController { + /** + * @var SilentConfigurationUpgradeService + */ + private $silentConfigurationUpgradeService; + + public function __construct( + SilentConfigurationUpgradeService $silentConfigurationUpgradeService + ) { + $this->silentConfigurationUpgradeService = $silentConfigurationUpgradeService; + } + /** * The init action renders an HTML response with HTML view having <head> section * containing resources to main .js routing. @@ -90,10 +101,9 @@ class LayoutController extends AbstractController */ public function executeSilentConfigurationUpdateAction(): ResponseInterface { - $silentUpdate = new SilentConfigurationUpgradeService(); $success = true; try { - $silentUpdate->execute(); + $this->silentConfigurationUpgradeService->execute(); } catch (ConfigurationChangedException $e) { $success = false; } diff --git a/typo3/sysext/install/Classes/Controller/MaintenanceController.php b/typo3/sysext/install/Classes/Controller/MaintenanceController.php index a373da54501328c7d988538996b2145e22006ed1..e4e73e5c4100a5082cfde65e2c78e949eb06f093 100644 --- a/typo3/sysext/install/Classes/Controller/MaintenanceController.php +++ b/typo3/sysext/install/Classes/Controller/MaintenanceController.php @@ -38,6 +38,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Install\Service\ClearCacheService; use TYPO3\CMS\Install\Service\ClearTableService; use TYPO3\CMS\Install\Service\LanguagePackService; +use TYPO3\CMS\Install\Service\LateBootService; use TYPO3\CMS\Install\Service\Typo3tempFileService; /** @@ -46,6 +47,58 @@ use TYPO3\CMS\Install\Service\Typo3tempFileService; */ class MaintenanceController extends AbstractController { + /** + * @var LateBootService + */ + private $lateBootService; + + /** + * @var ClearCacheService + */ + private $clearCacheService; + + /** + * @var LanguagePackService + */ + private $languagePackService; + + /** + * @var Typo3tempFileService + */ + private $typo3tempFileService; + + /** + * @var ConfigurationManager + */ + private $configurationManager; + + /** + * @var PasswordHashFactory + */ + private $passwordHashFactory; + + /** + * @var Locales + */ + private $locales; + + public function __construct( + LateBootService $lateBootService, + ClearCacheService $clearCacheService, + LanguagePackService $languagePackService, + Typo3tempFileService $typo3tempFileService, + ConfigurationManager $configurationManager, + PasswordHashFactory $passwordHashFactory, + Locales $locales + ) { + $this->lateBootService = $lateBootService; + $this->clearCacheService = $clearCacheService; + $this->languagePackService = $languagePackService; + $this->typo3tempFileService = $typo3tempFileService; + $this->configurationManager = $configurationManager; + $this->passwordHashFactory = $passwordHashFactory; + $this->locales = $locales; + } /** * Main "show the cards" view * @@ -68,7 +121,7 @@ class MaintenanceController extends AbstractController */ public function cacheClearAllAction(): ResponseInterface { - GeneralUtility::makeInstance(ClearCacheService::class)->clearAll(); + $this->clearCacheService->clearAll(); GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive(); $messageQueue = (new FlashMessageQueue('install'))->enqueue( new FlashMessage('Successfully cleared all caches and all available opcode caches.', 'Caches cleared') @@ -87,7 +140,7 @@ class MaintenanceController extends AbstractController */ public function clearTypo3tempFilesStatsAction(ServerRequestInterface $request): ResponseInterface { - $this->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); $view = $this->initializeStandaloneView($request, 'Maintenance/ClearTypo3tempFiles.html'); $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); $view->assignMultiple([ @@ -96,7 +149,7 @@ class MaintenanceController extends AbstractController return new JsonResponse( [ 'success' => true, - 'stats' => (new Typo3tempFileService())->getDirectoryStatistics(), + 'stats' => $this->typo3tempFileService->getDirectoryStatistics(), 'html' => $view->render(), 'buttons' => [ [ @@ -116,18 +169,17 @@ class MaintenanceController extends AbstractController */ public function clearTypo3tempFilesAction(ServerRequestInterface $request): ResponseInterface { - $this->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); $messageQueue = new FlashMessageQueue('install'); - $typo3tempFileService = new Typo3tempFileService(); $folder = $request->getParsedBody()['install']['folder']; // storageUid is an optional post param if FAL storages should be cleaned $storageUid = $request->getParsedBody()['install']['storageUid'] ?? null; if ($storageUid === null) { - $typo3tempFileService->clearAssetsFolder($folder); + $this->typo3tempFileService->clearAssetsFolder($folder); $messageQueue->enqueue(new FlashMessage('Cleared files in "' . $folder . '" folder')); } else { $storageUid = (int)$storageUid; - $failedDeletions = $typo3tempFileService->clearProcessedFiles($storageUid); + $failedDeletions = $this->typo3tempFileService->clearProcessedFiles($storageUid); if ($failedDeletions) { $messageQueue->enqueue(new FlashMessage( 'Failed to delete ' . $failedDeletions . ' processed files. See TYPO3 log (by default typo3temp/var/log/typo3_*.log)', @@ -206,7 +258,7 @@ class MaintenanceController extends AbstractController */ public function databaseAnalyzerAnalyzeAction(ServerRequestInterface $request): ResponseInterface { - $container = $this->loadExtLocalconfDatabaseAndExtTables(); + $container = $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); $messageQueue = new FlashMessageQueue('install'); $suggestions = []; try { @@ -362,7 +414,7 @@ class MaintenanceController extends AbstractController */ public function databaseAnalyzerExecuteAction(ServerRequestInterface $request): ResponseInterface { - $container = $this->loadExtLocalconfDatabaseAndExtTables(); + $container = $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); $messageQueue = new FlashMessageQueue('install'); $selectedHashes = $request->getParsedBody()['install']['hashes'] ?? []; if (empty($selectedHashes)) { @@ -521,7 +573,7 @@ class MaintenanceController extends AbstractController FlashMessage::ERROR )); } else { - $hashInstance = GeneralUtility::makeInstance(PasswordHashFactory::class)->getDefaultHashInstance('BE'); + $hashInstance = $this->passwordHashFactory->getDefaultHashInstance('BE'); $hashedPassword = $hashInstance->getHashedPassword($password); $adminUserFields = [ 'username' => $username, @@ -548,8 +600,7 @@ class MaintenanceController extends AbstractController $newSystemMaintainersList[] = $newAdminUserUid; // Update the LocalConfiguration.php file with the new list - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); - $configurationManager->setLocalConfigurationValuesByPathValuePairs( + $this->configurationManager->setLocalConfigurationValuesByPathValuePairs( ['SYS/systemMaintainers' => $newSystemMaintainersList] ); } @@ -585,15 +636,14 @@ class MaintenanceController extends AbstractController 'languagePacksUpdateIsoTimesToken' => $formProtection->generateToken('installTool', 'languagePacksUpdateIsoTimes'), ]); // This action needs TYPO3_CONF_VARS for full GeneralUtility::getUrl() config - $this->loadExtLocalconfDatabaseAndExtTables(); - $languagePacksService = GeneralUtility::makeInstance(LanguagePackService::class); - $languagePacksService->updateMirrorBaseUrl(); - $extensions = $languagePacksService->getExtensionLanguagePackDetails(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); + $this->languagePackService->updateMirrorBaseUrl(); + $extensions = $this->languagePackService->getExtensionLanguagePackDetails(); return new JsonResponse([ 'success' => true, - 'languages' => $languagePacksService->getLanguageDetails(), + 'languages' => $this->languagePackService->getLanguageDetails(), 'extensions' => $extensions, - 'activeLanguages' => $languagePacksService->getActiveLanguages(), + 'activeLanguages' => $this->languagePackService->getActiveLanguages(), 'activeExtensions' => array_column($extensions, 'key'), 'html' => $view->render(), ]); @@ -609,7 +659,6 @@ class MaintenanceController extends AbstractController { $messageQueue = new FlashMessageQueue('install'); $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class); - $locales = GeneralUtility::makeInstance(Locales::class); $availableLanguages = $languagePackService->getAvailableLanguages(); $activeLanguages = $languagePackService->getActiveLanguages(); $iso = $request->getParsedBody()['install']['iso']; @@ -617,7 +666,7 @@ class MaintenanceController extends AbstractController foreach ($availableLanguages as $availableIso => $name) { if ($availableIso === $iso && !in_array($availableIso, $activeLanguages, true)) { $activateArray[] = $iso; - $dependencies = $locales->getLocaleDependencies($availableIso); + $dependencies = $this->locales->getLocaleDependencies($availableIso); if (!empty($dependencies)) { foreach ($dependencies as $dependency) { if (!in_array($dependency, $activeLanguages, true)) { @@ -630,8 +679,7 @@ class MaintenanceController extends AbstractController if (!empty($activateArray)) { $activeLanguages = array_merge($activeLanguages, $activateArray); sort($activeLanguages); - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); - $configurationManager->setLocalConfigurationValueByPath( + $this->configurationManager->setLocalConfigurationValueByPath( 'EXTCONF/lang', ['availableLanguages' => $activeLanguages] ); @@ -666,7 +714,6 @@ class MaintenanceController extends AbstractController { $messageQueue = new FlashMessageQueue('install'); $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class); - $locales = GeneralUtility::makeInstance(Locales::class); $availableLanguages = $languagePackService->getAvailableLanguages(); $activeLanguages = $languagePackService->getActiveLanguages(); $iso = $request->getParsedBody()['install']['iso']; @@ -678,7 +725,7 @@ class MaintenanceController extends AbstractController if ($activeLanguage === $iso) { continue; } - $dependencies = $locales->getLocaleDependencies($activeLanguage); + $dependencies = $this->locales->getLocaleDependencies($activeLanguage); if (in_array($iso, $dependencies, true)) { $otherActiveLanguageDependencies[] = $activeLanguage; } @@ -708,8 +755,7 @@ class MaintenanceController extends AbstractController } $newActiveLanguages[] = $activeLanguage; } - $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); - $configurationManager->setLocalConfigurationValueByPath( + $this->configurationManager->setLocalConfigurationValueByPath( 'EXTCONF/lang', ['availableLanguages' => $newActiveLanguages] ); @@ -743,7 +789,7 @@ class MaintenanceController extends AbstractController */ public function languagePacksUpdatePackAction(ServerRequestInterface $request): ResponseInterface { - $this->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); $iso = $request->getParsedBody()['install']['iso']; $key = $request->getParsedBody()['install']['extension']; $languagePackService = GeneralUtility::makeInstance(LanguagePackService::class); diff --git a/typo3/sysext/install/Classes/Controller/SettingsController.php b/typo3/sysext/install/Classes/Controller/SettingsController.php index 00a6b32d772a80867243cb626ae0d6b138c25273..e62054d22f13dba3cad50118ebc4ceba385d4883 100644 --- a/typo3/sysext/install/Classes/Controller/SettingsController.php +++ b/typo3/sysext/install/Classes/Controller/SettingsController.php @@ -29,7 +29,7 @@ use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; use TYPO3\CMS\Core\Http\JsonResponse; -use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Localization\LanguageServiceFactory; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageQueue; use TYPO3\CMS\Core\Package\PackageManager; @@ -46,6 +46,31 @@ use TYPO3\CMS\Install\Service\LocalConfigurationValueService; */ class SettingsController extends AbstractController { + /** + * @var PackageManager + */ + private $packageManager; + + /** + * @var ExtensionConfigurationService + */ + private $extensionConfigurationService; + + /** + * @var LanguageServiceFactory + */ + private $languageServiceFactory; + + public function __construct( + PackageManager $packageManager, + ExtensionConfigurationService $extensionConfigurationService, + LanguageServiceFactory $languageServiceFactory + ) { + $this->packageManager = $packageManager; + $this->extensionConfigurationService = $extensionConfigurationService; + $this->languageServiceFactory = $languageServiceFactory; + } + /** * Main "show the cards" view * @@ -379,15 +404,14 @@ class SettingsController extends AbstractController public function extensionConfigurationGetContentAction(ServerRequestInterface $request): ResponseInterface { // Extension configuration needs initialized $GLOBALS['LANG'] - $GLOBALS['LANG'] = LanguageService::create('default'); - $extensionConfigurationService = new ExtensionConfigurationService(); + $GLOBALS['LANG'] = $this->languageServiceFactory->create('default'); $extensionsWithConfigurations = []; - $activePackages = GeneralUtility::makeInstance(PackageManager::class)->getActivePackages(); + $activePackages = $this->packageManager->getActivePackages(); foreach ($activePackages as $extensionKey => $activePackage) { if (@file_exists($activePackage->getPackagePath() . 'ext_conf_template.txt')) { $extensionsWithConfigurations[$extensionKey] = [ 'packageInfo' => $activePackage, - 'configuration' => $extensionConfigurationService->getConfigurationPreparedForView($extensionKey), + 'configuration' => $this->extensionConfigurationService->getConfigurationPreparedForView($extensionKey), ]; } } diff --git a/typo3/sysext/install/Classes/Controller/UpgradeController.php b/typo3/sysext/install/Classes/Controller/UpgradeController.php index 6236a0457a55d557a2f64507cf7b58f597130488..d77e1626377a193b8617eee5c2c0d09e9521fe60 100644 --- a/typo3/sysext/install/Classes/Controller/UpgradeController.php +++ b/typo3/sysext/install/Classes/Controller/UpgradeController.php @@ -86,6 +86,11 @@ class UpgradeController extends AbstractController */ protected $coreVersionService; + /** + * @var UpgradeWizardsService + */ + private $upgradeWizardsService; + /** * @var PackageManager */ @@ -96,14 +101,14 @@ class UpgradeController extends AbstractController */ private $lateBootService; - /** - * @param PackageManager $packageManager - * @param LateBootService $lateBootService - */ - public function __construct(PackageManager $packageManager, LateBootService $lateBootService) - { + public function __construct( + PackageManager $packageManager, + LateBootService $lateBootService, + UpgradeWizardsService $upgradeWizardsService + ) { $this->packageManager = $packageManager; $this->lateBootService = $lateBootService; + $this->upgradeWizardsService = $upgradeWizardsService; } /** @@ -945,13 +950,12 @@ class UpgradeController extends AbstractController public function upgradeWizardsBlockingDatabaseAddsAction(): ResponseInterface { // ext_localconf, db and ext_tables must be loaded for the updates :( - $this->loadExtLocalconfDatabaseAndExtTables(false); - $upgradeWizardsService = new UpgradeWizardsService(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); $adds = []; $needsUpdate = false; try { - $adds = $upgradeWizardsService->getBlockingDatabaseAdds(); - $this->resetGlobalContainer(); + $adds = $this->upgradeWizardsService->getBlockingDatabaseAdds(); + $this->lateBootService->resetGlobalContainer(); if (!empty($adds)) { $needsUpdate = true; } @@ -973,10 +977,9 @@ class UpgradeController extends AbstractController public function upgradeWizardsBlockingDatabaseExecuteAction(): ResponseInterface { // ext_localconf, db and ext_tables must be loaded for the updates :( - $this->loadExtLocalconfDatabaseAndExtTables(false); - $upgradeWizardsService = new UpgradeWizardsService(); - $upgradeWizardsService->addMissingTablesAndFields(); - $this->resetGlobalContainer(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); + $this->upgradeWizardsService->addMissingTablesAndFields(); + $this->lateBootService->resetGlobalContainer(); $messages = new FlashMessageQueue('install'); $messages->enqueue(new FlashMessage( '', @@ -995,8 +998,7 @@ class UpgradeController extends AbstractController */ public function upgradeWizardsBlockingDatabaseCharsetFixAction(): ResponseInterface { - $upgradeWizardsService = new UpgradeWizardsService(); - $upgradeWizardsService->setDatabaseCharsetUtf8(); + $this->upgradeWizardsService->setDatabaseCharsetUtf8(); $messages = new FlashMessageQueue('install'); $messages->enqueue(new FlashMessage( '', @@ -1015,8 +1017,7 @@ class UpgradeController extends AbstractController */ public function upgradeWizardsBlockingDatabaseCharsetTestAction(): ResponseInterface { - $upgradeWizardsService = new UpgradeWizardsService(); - $result = !$upgradeWizardsService->isDatabaseCharsetUtf8(); + $result = !$this->upgradeWizardsService->isDatabaseCharsetUtf8(); return new JsonResponse([ 'success' => true, 'needsUpdate' => $result, @@ -1030,11 +1031,10 @@ class UpgradeController extends AbstractController */ public function upgradeWizardsDoneUpgradesAction(): ResponseInterface { - $this->loadExtLocalconfDatabaseAndExtTables(false); - $upgradeWizardsService = new UpgradeWizardsService(); - $wizardsDone = $upgradeWizardsService->listOfWizardsDone(); - $rowUpdatersDone = $upgradeWizardsService->listOfRowUpdatersDone(); - $this->resetGlobalContainer(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); + $wizardsDone = $this->upgradeWizardsService->listOfWizardsDone(); + $rowUpdatersDone = $this->upgradeWizardsService->listOfRowUpdatersDone(); + $this->lateBootService->resetGlobalContainer(); $messages = new FlashMessageQueue('install'); if (empty($wizardsDone) && empty($rowUpdatersDone)) { $messages->enqueue(new FlashMessage( @@ -1059,11 +1059,10 @@ class UpgradeController extends AbstractController public function upgradeWizardsExecuteAction(ServerRequestInterface $request): ResponseInterface { // ext_localconf, db and ext_tables must be loaded for the updates :( - $this->loadExtLocalconfDatabaseAndExtTables(false); - $upgradeWizardsService = new UpgradeWizardsService(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); $identifier = $request->getParsedBody()['install']['identifier']; - $messages = $upgradeWizardsService->executeWizard($identifier); - $this->resetGlobalContainer(); + $messages = $this->upgradeWizardsService->executeWizard($identifier); + $this->lateBootService->resetGlobalContainer(); return new JsonResponse([ 'success' => true, 'status' => $messages, @@ -1079,11 +1078,10 @@ class UpgradeController extends AbstractController public function upgradeWizardsInputAction(ServerRequestInterface $request): ResponseInterface { // ext_localconf, db and ext_tables must be loaded for the updates :( - $this->loadExtLocalconfDatabaseAndExtTables(false); - $upgradeWizardsService = new UpgradeWizardsService(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); $identifier = $request->getParsedBody()['install']['identifier']; - $result = $upgradeWizardsService->getWizardUserInput($identifier); - $this->resetGlobalContainer(); + $result = $this->upgradeWizardsService->getWizardUserInput($identifier); + $this->lateBootService->resetGlobalContainer(); return new JsonResponse([ 'success' => true, 'status' => [], @@ -1099,10 +1097,9 @@ class UpgradeController extends AbstractController public function upgradeWizardsListAction(): ResponseInterface { // ext_localconf, db and ext_tables must be loaded for the updates :( - $this->loadExtLocalconfDatabaseAndExtTables(false); - $upgradeWizardsService = new UpgradeWizardsService(); - $wizards = $upgradeWizardsService->getUpgradeWizardsList(); - $this->resetGlobalContainer(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); + $wizards = $this->upgradeWizardsService->getUpgradeWizardsList(); + $this->lateBootService->resetGlobalContainer(); return new JsonResponse([ 'success' => true, 'status' => [], @@ -1118,11 +1115,10 @@ class UpgradeController extends AbstractController */ public function upgradeWizardsMarkUndoneAction(ServerRequestInterface $request): ResponseInterface { - $this->loadExtLocalconfDatabaseAndExtTables(false); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(false); $wizardToBeMarkedAsUndoneIdentifier = $request->getParsedBody()['install']['identifier']; - $upgradeWizardsService = new UpgradeWizardsService(); - $result = $upgradeWizardsService->markWizardUndone($wizardToBeMarkedAsUndoneIdentifier); - $this->resetGlobalContainer(); + $result = $this->upgradeWizardsService->markWizardUndone($wizardToBeMarkedAsUndoneIdentifier); + $this->lateBootService->resetGlobalContainer(); $messages = new FlashMessageQueue('install'); if ($result) { $messages->enqueue(new FlashMessage( @@ -1178,7 +1174,7 @@ class UpgradeController extends AbstractController ); } // @todo: Does the core updater really depend on loaded ext_* files? - $this->loadExtLocalconfDatabaseAndExtTables(); + $this->lateBootService->loadExtLocalconfDatabaseAndExtTables(); } /** diff --git a/typo3/sysext/install/Classes/Middleware/Installer.php b/typo3/sysext/install/Classes/Middleware/Installer.php index 9ffee4ded10e725b77de309a83e82a211fc14ad5..b76301f51737f662591f27c7047ab9d3cc71e217 100644 --- a/typo3/sysext/install/Classes/Middleware/Installer.php +++ b/typo3/sysext/install/Classes/Middleware/Installer.php @@ -17,6 +17,7 @@ declare(strict_types=1); namespace TYPO3\CMS\Install\Middleware; +use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -35,6 +36,16 @@ use TYPO3\CMS\Install\Service\SessionService; */ class Installer implements MiddlewareInterface { + /** + * @var ContainerInterface + */ + private $container; + + public function __construct(ContainerInterface $container) + { + $this->container = $container; + } + /** * Handles an Install Tool request when nothing is there * @@ -49,7 +60,8 @@ class Installer implements MiddlewareInterface return $handler->handle($request); } - $controller = new InstallerController(); + // Lazy load InstallerController, to instantiate the class and the dependencies only if we handle an install request. + $controller = $this->container->get(InstallerController::class); $actionName = $request->getParsedBody()['install']['action'] ?? $request->getQueryParams()['install']['action'] ?? 'init'; $action = $actionName . 'Action'; diff --git a/typo3/sysext/install/Classes/Middleware/Maintenance.php b/typo3/sysext/install/Classes/Middleware/Maintenance.php index fa74623335c282ee8c0ac310cba33023e7ff2c7f..5e57ac140c4c5c44d9a8990012c7bd7320c54fe1 100644 --- a/typo3/sysext/install/Classes/Middleware/Maintenance.php +++ b/typo3/sysext/install/Classes/Middleware/Maintenance.php @@ -126,14 +126,14 @@ class Maintenance implements MiddlewareInterface 'isAuthorized' => $session->isAuthorized() ]); } elseif ($actionName === 'init') { - $controller = new LayoutController(); + $controller = $this->container->get(LayoutController::class); $response = $controller->initAction($request); } elseif ($actionName === 'checkEnableInstallToolFile') { $response = new JsonResponse([ 'success' => $this->checkEnableInstallToolFile(), ]); } elseif ($actionName === 'showEnableInstallToolFile') { - $controller = new LoginController(); + $controller = $this->container->get(LoginController::class); $response = $controller->showEnableInstallToolFileAction($request); } elseif ($actionName === 'checkLogin') { if (!$this->checkEnableInstallToolFile() && !$session->isAuthorizedBackendUserSession()) { @@ -156,7 +156,7 @@ class Maintenance implements MiddlewareInterface if (!$this->checkEnableInstallToolFile()) { throw new \RuntimeException('Not authorized', 1505564888); } - $controller = new LoginController(); + $controller = $this->container->get(LoginController::class); $response = $controller->showLoginAction($request); } elseif ($actionName === 'login') { if (!$this->checkEnableInstallToolFile()) { @@ -221,7 +221,7 @@ class Maintenance implements MiddlewareInterface $this->recreatePackageStatesFileIfMissing(); $className = $this->controllers[$controllerName]; /** @var AbstractController $controller */ - $controller = $this->container->has($className) ? $this->container->get($className) : new $className(); + $controller = $this->container->get($className); if (!method_exists($controller, $action)) { throw new \RuntimeException( 'Unknown action method ' . $action . ' in controller ' . $controllerName, diff --git a/typo3/sysext/install/Classes/Service/CoreUpdateService.php b/typo3/sysext/install/Classes/Service/CoreUpdateService.php index 44ecd2af22793d6caec92363b9692d1dcb968aef..b5240a8e175ae21e27002c5acc976edf2e3679b8 100644 --- a/typo3/sysext/install/Classes/Service/CoreUpdateService.php +++ b/typo3/sysext/install/Classes/Service/CoreUpdateService.php @@ -38,7 +38,7 @@ use TYPO3\CMS\Install\FolderStructure\DefaultFactory; class CoreUpdateService { /** - * @var \TYPO3\CMS\Install\Service\CoreVersionService + * @var CoreVersionService */ protected $coreVersionService; @@ -68,12 +68,9 @@ class CoreUpdateService */ protected $downloadBaseUri; - /** - * @param CoreVersionService $coreVersionService - */ - public function __construct(CoreVersionService $coreVersionService = null) + public function __construct(CoreVersionService $coreVersionService) { - $this->coreVersionService = $coreVersionService ?: GeneralUtility::makeInstance(CoreVersionService::class); + $this->coreVersionService = $coreVersionService; $this->setDownloadTargetPath(Environment::getVarPath() . '/transient/'); $this->symlinkToCoreFiles = $this->discoverCurrentCoreSymlink(); $this->downloadBaseUri = 'https://get.typo3.org'; diff --git a/typo3/sysext/install/Classes/Service/CoreVersionService.php b/typo3/sysext/install/Classes/Service/CoreVersionService.php index 26521463812f06c919ccd719ae6cdc2529b7db69..1150d919d0943a7e6cc1625c1b91043502f15294 100644 --- a/typo3/sysext/install/Classes/Service/CoreVersionService.php +++ b/typo3/sysext/install/Classes/Service/CoreVersionService.php @@ -18,7 +18,6 @@ declare(strict_types=1); namespace TYPO3\CMS\Install\Service; use TYPO3\CMS\Core\Information\Typo3Version; -use TYPO3\CMS\Core\Registry; use TYPO3\CMS\Core\Utility\GeneralUtility; /** @@ -27,11 +26,6 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; */ class CoreVersionService { - /** - * @var \TYPO3\CMS\Core\Registry - */ - protected $registry; - /** * Base URI for TYPO3 Version REST api * @@ -39,14 +33,6 @@ class CoreVersionService */ protected $apiBaseUrl = 'https://get.typo3.org/v1/api/'; - /** - * Initialize update URI - */ - public function __construct() - { - $this->registry = GeneralUtility::makeInstance(Registry::class); - } - /** * Development git checkout versions always end with '-dev'. They are * not "released" as such and can not be updated. diff --git a/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php b/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php index 0570d62624826368ef2087a6e273317ba49c021a..aa05c1b07b78daafc6cef9d7dd152a4eb4543a50 100644 --- a/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php +++ b/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php @@ -21,7 +21,6 @@ use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationPathDoesNotExis use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\TypoScript\Parser\ConstantConfigurationParser; -use TYPO3\CMS\Core\Utility\GeneralUtility; /** * Service to prepare extension configuration settings from ext_conf_template.txt @@ -35,15 +34,22 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; */ class ExtensionConfigurationService { + /** + * @var PackageManager + */ + private $packageManager; /** - * @var \TYPO3\CMS\Core\TypoScript\Parser\ConstantConfigurationParser + * @var ConstantConfigurationParser */ private $configurationParser; - public function __construct(ConstantConfigurationParser $configurationParser = null) - { - $this->configurationParser = $configurationParser ?? GeneralUtility::makeInstance(ConstantConfigurationParser::class); + public function __construct( + PackageManager $packageManager, + ConstantConfigurationParser $configurationParser + ) { + $this->packageManager = $packageManager; + $this->configurationParser = $configurationParser; } /** * Compiles ext_conf_template file and merges it with values from LocalConfiguration['EXTENSIONS']. @@ -54,7 +60,7 @@ class ExtensionConfigurationService */ public function getConfigurationPreparedForView(string $extensionKey): array { - $package = GeneralUtility::makeInstance(PackageManager::class)->getPackage($extensionKey); + $package = $this->packageManager->getPackage($extensionKey); if (!@is_file($package->getPackagePath() . 'ext_conf_template.txt')) { return []; } diff --git a/typo3/sysext/install/Classes/Service/LanguagePackService.php b/typo3/sysext/install/Classes/Service/LanguagePackService.php index ff50efe3c18b033e79582205a3e22071d0e19b36..59fc0d15d75159bec2ecef0c1f0bc51f240b4078 100644 --- a/typo3/sysext/install/Classes/Service/LanguagePackService.php +++ b/typo3/sysext/install/Classes/Service/LanguagePackService.php @@ -69,12 +69,12 @@ class LanguagePackService implements LoggerAwareInterface ]; private const LANGUAGE_PACK_URL = 'https://localize.typo3.org/xliff/'; - public function __construct(EventDispatcherInterface $eventDispatcher = null, RequestFactory $requestFactory = null) + public function __construct(EventDispatcherInterface $eventDispatcher, RequestFactory $requestFactory) { - $this->eventDispatcher = $eventDispatcher ?? GeneralUtility::getContainer()->get(EventDispatcherInterface::class); + $this->eventDispatcher = $eventDispatcher; $this->locales = GeneralUtility::makeInstance(Locales::class); $this->registry = GeneralUtility::makeInstance(Registry::class); - $this->requestFactory = $requestFactory ?? GeneralUtility::makeInstance(RequestFactory::class); + $this->requestFactory = $requestFactory; } /** diff --git a/typo3/sysext/install/Classes/Service/LateBootService.php b/typo3/sysext/install/Classes/Service/LateBootService.php index b85e860c8e9c6210ea0297203c201acfca73e227..ac779dfa7ff823a2c93a0b7c78834d0e68a1a6fe 100644 --- a/typo3/sysext/install/Classes/Service/LateBootService.php +++ b/typo3/sysext/install/Classes/Service/LateBootService.php @@ -114,6 +114,12 @@ class LateBootService /** * Bootstrap a non-failsafe container and load ext_localconf * + * Use by actions like the database analyzer and the upgrade wizards which + * need additional bootstrap actions performed. + * + * Those actions can potentially fatal if some old extension is loaded that triggers + * a fatal in ext_localconf or ext_tables code! Use only if really needed. + * * @param bool $resetContainer * @return ContainerInterface */ @@ -141,4 +147,9 @@ class LateBootService return $container; } + + public function resetGlobalContainer(): void + { + $this->makeCurrent(null, []); + } } diff --git a/typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php b/typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php index 44ea736908fb8a456a15fa22b15d1c0af8c0922e..3e51c11a092b74b7d93abc1dccb5b0e263e12006 100644 --- a/typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php +++ b/typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php @@ -43,7 +43,7 @@ use TYPO3\CMS\Install\Service\Exception\ConfigurationChangedException; class SilentConfigurationUpgradeService { /** - * @var \TYPO3\CMS\Core\Configuration\ConfigurationManager + * @var ConfigurationManager */ protected $configurationManager; @@ -157,9 +157,9 @@ class SilentConfigurationUpgradeService 'SYS/systemLogLevel', ]; - public function __construct(ConfigurationManager $configurationManager = null) + public function __construct(ConfigurationManager $configurationManager) { - $this->configurationManager = $configurationManager ?: GeneralUtility::makeInstance(ConfigurationManager::class); + $this->configurationManager = $configurationManager; } /** diff --git a/typo3/sysext/install/Classes/ServiceProvider.php b/typo3/sysext/install/Classes/ServiceProvider.php index e7279fa076b4ab0012818328f055659f17fadcde..5226c5ffbf36abf738a4c0bca629451a80f27b6d 100644 --- a/typo3/sysext/install/Classes/ServiceProvider.php +++ b/typo3/sysext/install/Classes/ServiceProvider.php @@ -18,15 +18,25 @@ declare(strict_types=1); namespace TYPO3\CMS\Install; use Psr\Container\ContainerInterface; +use Psr\EventDispatcher\EventDispatcherInterface; use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Configuration\SiteConfiguration; use TYPO3\CMS\Core\Console\CommandRegistry; use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Crypto\PasswordHashing\PasswordHashFactory; use TYPO3\CMS\Core\DependencyInjection\ContainerBuilder; use TYPO3\CMS\Core\Http\MiddlewareDispatcher; +use TYPO3\CMS\Core\Http\RequestFactory; +use TYPO3\CMS\Core\Imaging\IconFactory; +use TYPO3\CMS\Core\Imaging\IconRegistry; +use TYPO3\CMS\Core\Localization\LanguageServiceFactory; +use TYPO3\CMS\Core\Localization\Locales; use TYPO3\CMS\Core\Middleware\NormalizedParamsAttribute as NormalizedParamsMiddleware; use TYPO3\CMS\Core\Package\AbstractServiceProvider; +use TYPO3\CMS\Core\Package\FailsafePackageManager; use TYPO3\CMS\Core\Package\PackageManager; +use TYPO3\CMS\Core\Registry; +use TYPO3\CMS\Core\TypoScript\Parser\ConstantConfigurationParser; /** * @internal @@ -43,11 +53,25 @@ class ServiceProvider extends AbstractServiceProvider return [ Http\Application::class => [ static::class, 'getApplication' ], Http\NotFoundRequestHandler::class => [ static::class, 'getNotFoundRequestHandler' ], - Service\LateBootService::class => [ static::class, 'getLateBootService' ], Service\ClearCacheService::class => [ static::class, 'getClearCacheService' ], + Service\CoreUpdateService::class => [ static::class, 'getCoreUpdateService' ], + Service\CoreVersionService::class => [ static::class, 'getCoreVersionService' ], + Service\ExtensionConfigurationService::class => [ static::class, 'getExtensionConfigurationService' ], + Service\LanguagePackService::class => [ static::class, 'getLanguagePackService' ], + Service\LateBootService::class => [ static::class, 'getLateBootService' ], Service\LoadTcaService::class => [ static::class, 'getLoadTcaService' ], + Service\SilentConfigurationUpgradeService::class => [ static::class, 'getSilentConfigurationUpgradeService' ], + Service\Typo3tempFileService::class => [ static::class, 'getTypo3tempFileService' ], + Service\UpgradeWizardsService::class => [ static::class, 'getUpgradeWizardsService' ], + Middleware\Installer::class => [ static::class, 'getInstallerMiddleware' ], Middleware\Maintenance::class => [ static::class, 'getMaintenanceMiddleware' ], Controller\EnvironmentController::class => [ static::class, 'getEnvironmentController' ], + Controller\IconController::class => [ static::class, 'getIconController' ], + Controller\InstallerController::class => [ static::class, 'getInstallerController' ], + Controller\LayoutController::class => [ static::class, 'getLayoutController' ], + Controller\LoginController::class => [ static::class, 'getLoginController' ], + Controller\MaintenanceController::class => [ static::class, 'getMaintenanceController' ], + Controller\SettingsController::class => [ static::class, 'getSettingsController' ], Controller\UpgradeController::class => [ static::class, 'getUpgradeController' ], Command\LanguagePackCommand::class => [ static::class, 'getLanguagePackCommand' ], Command\UpgradeWizardRunCommand::class => [ static::class, 'getUpgradeWizardRunCommand' ], @@ -80,6 +104,41 @@ class ServiceProvider extends AbstractServiceProvider return new Http\NotFoundRequestHandler(); } + public static function getClearCacheService(ContainerInterface $container): Service\ClearCacheService + { + return new Service\ClearCacheService( + $container->get(Service\LateBootService::class) + ); + } + + public static function getCoreUpdateService(ContainerInterface $container): Service\CoreUpdateService + { + return new Service\CoreUpdateService( + $container->get(Service\CoreVersionService::class) + ); + } + + public static function getCoreVersionService(ContainerInterface $container): Service\CoreVersionService + { + return new Service\CoreVersionService(); + } + + public static function getExtensionConfigurationService(ContainerInterface $container): Service\ExtensionConfigurationService + { + return new Service\ExtensionConfigurationService( + $container->get(PackageManager::class), + $container->get(ConstantConfigurationParser::class) + ); + } + + public static function getLanguagePackService(ContainerInterface $container): Service\LanguagePackService + { + return new Service\LanguagePackService( + $container->get(EventDispatcherInterface::class), + $container->get(RequestFactory::class) + ); + } + public static function getLateBootService(ContainerInterface $container): Service\LateBootService { return new Service\LateBootService( @@ -88,20 +147,38 @@ class ServiceProvider extends AbstractServiceProvider ); } - public static function getClearCacheService(ContainerInterface $container): Service\ClearCacheService + public static function getLoadTcaService(ContainerInterface $container): Service\LoadTcaService { - return new Service\ClearCacheService($container->get(Service\LateBootService::class)); + return new Service\LoadTcaService( + $container->get(Service\LateBootService::class) + ); } - public static function getLoadTcaService(ContainerInterface $container): Service\LoadTcaService + public static function getSilentConfigurationUpgradeService(ContainerInterface $container): Service\SilentConfigurationUpgradeService + { + return new Service\SilentConfigurationUpgradeService( + $container->get(ConfigurationManager::class) + ); + } + public static function getTypo3tempFileService(ContainerInterface $container): Service\Typo3tempFileService + { + return new Service\Typo3tempFileService(); + } + + public static function getUpgradeWizardsService(ContainerInterface $container): Service\UpgradeWizardsService { - return new Service\LoadTcaService($container->get(Service\LateBootService::class)); + return new Service\UpgradeWizardsService(); + } + + public static function getInstallerMiddleware(ContainerInterface $container): Middleware\Installer + { + return new Middleware\Installer($container); } public static function getMaintenanceMiddleware(ContainerInterface $container): Middleware\Maintenance { return new Middleware\Maintenance( - $container->get(PackageManager::class), + $container->get(FailsafePackageManager::class), $container->get(ConfigurationManager::class), $container->get(PasswordHashFactory::class), $container @@ -115,11 +192,66 @@ class ServiceProvider extends AbstractServiceProvider ); } + public static function getIconController(ContainerInterface $container): Controller\IconController + { + return new Controller\IconController( + $container->get(IconRegistry::class), + $container->get(IconFactory::class) + ); + } + + public static function getInstallerController(ContainerInterface $container): Controller\InstallerController + { + return new Controller\InstallerController( + $container->get(Service\LateBootService::class), + $container->get(Service\SilentConfigurationUpgradeService::class), + $container->get(ConfigurationManager::class), + $container->get(SiteConfiguration::class), + $container->get(Registry::class), + $container->get(FailsafePackageManager::class) + ); + } + + public static function getLayoutController(ContainerInterface $container): Controller\LayoutController + { + return new Controller\LayoutController( + $container->get(Service\SilentConfigurationUpgradeService::class) + ); + } + + public static function getLoginController(ContainerInterface $container): Controller\LoginController + { + return new Controller\LoginController(); + } + + public static function getMaintenanceController(ContainerInterface $container): Controller\MaintenanceController + { + return new Controller\MaintenanceController( + $container->get(Service\LateBootService::class), + $container->get(Service\ClearCacheService::class), + $container->get(Service\LanguagePackService::class), + $container->get(Service\Typo3tempFileService::class), + $container->get(ConfigurationManager::class), + $container->get(PasswordHashFactory::class), + $container->get(Locales::class) + ); + } + + public static function getSettingsController(ContainerInterface $container): Controller\SettingsController + { + return new Controller\SettingsController( + $container->get(PackageManager::class), + $container->get(Service\ExtensionConfigurationService::class), + $container->get(LanguageServiceFactory::class) + ); + } + public static function getUpgradeController(ContainerInterface $container): Controller\UpgradeController { return new Controller\UpgradeController( $container->get(PackageManager::class), - $container->get(Service\LateBootService::class) + $container->get(Service\LateBootService::class), + $container->get(Service\UpgradeWizardsService::class) ); } @@ -130,12 +262,20 @@ class ServiceProvider extends AbstractServiceProvider public static function getUpgradeWizardRunCommand(ContainerInterface $container): Command\UpgradeWizardRunCommand { - return new Command\UpgradeWizardRunCommand('upgrade:run'); + return new Command\UpgradeWizardRunCommand( + 'upgrade:run', + $container->get(Service\LateBootService::class), + $container->get(Service\UpgradeWizardsService::class) + ); } public static function getUpgradeWizardListCommand(ContainerInterface $container): Command\UpgradeWizardListCommand { - return new Command\UpgradeWizardListCommand('upgrade:list'); + return new Command\UpgradeWizardListCommand( + 'upgrade:list', + $container->get(Service\LateBootService::class), + $container->get(Service\UpgradeWizardsService::class) + ); } public static function configureCommands(ContainerInterface $container, CommandRegistry $commandRegistry): CommandRegistry diff --git a/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php b/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php index 68dbd41cc6071134e966d05c0e496666ad4a2088..449ecf66e5490bae17da51acb3b713048ae1c188 100644 --- a/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php +++ b/typo3/sysext/install/Tests/Unit/Controller/UpgradeControllerTest.php @@ -18,10 +18,8 @@ declare(strict_types=1); namespace TYPO3\CMS\Install\Tests\Unit\Controller; use Psr\Http\Message\ServerRequestInterface; -use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Fluid\View\StandaloneView; use TYPO3\CMS\Install\Controller\UpgradeController; -use TYPO3\CMS\Install\Service\LateBootService; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; /** @@ -73,16 +71,9 @@ class UpgradeControllerTest extends UnitTestCase ], ]); - $packageManagerMock = $this->getMockBuilder(PackageManager::class) - ->disableOriginalConstructor() - ->getMock(); - $lateBootServiceMock = $this->getMockBuilder(LateBootService::class) - ->disableOriginalConstructor() - ->getMock(); - /** @var UpgradeController|\PHPUnit\Framework\MockObject\MockObject $subject */ $subject = $this->getMockBuilder(UpgradeController::class) - ->setConstructorArgs([$packageManagerMock, $lateBootServiceMock]) + ->disableOriginalConstructor() ->setMethods(['getDocumentationFiles', 'initializeStandaloneView']) ->getMock();