*/
class SiteDatabaseEditRow implements FormDataProviderInterface
{
+ /**
+ * @var SiteConfiguration
+ */
+ protected $siteConfiguration;
+
+ /**
+ * @param SiteConfiguration $siteConfiguration
+ */
+ public function __construct(SiteConfiguration $siteConfiguration = null)
+ {
+ $this->siteConfiguration = $siteConfiguration ?? GeneralUtility::makeInstance(
+ SiteConfiguration::class,
+ Environment::getConfigPath() . '/sites'
+ );
+ }
+
/**
* First level of ['customData']['siteData'] to ['databaseRow']
*
}
$tableName = $result['tableName'];
- $siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
+ $siteFinder = GeneralUtility::makeInstance(SiteFinder::class, $this->siteConfiguration);
if ($tableName === 'site') {
$rootPageId = (int)$result['vanillaUid'];
$rowData = $this->getRawConfigurationForSiteWithRootPageId($siteFinder, $rootPageId);
protected function getRawConfigurationForSiteWithRootPageId(SiteFinder $siteFinder, int $rootPageId): array
{
$site = $siteFinder->getSiteByRootPageId($rootPageId);
- $siteConfiguration = GeneralUtility::makeInstance(
- SiteConfiguration::class,
- Environment::getConfigPath() . '/sites'
- );
// load config as it is stored on disk (without replacements)
- return $siteConfiguration->load($site->getIdentifier());
+ return $this->siteConfiguration->load($site->getIdentifier());
}
}
'command' => 'new',
'foo' => 'bar',
];
- $this->assertSame($input, (new SiteDatabaseEditRow())->addData($input));
+ $siteConfigurationProphecy = $this->prophesize(SiteConfiguration::class);
+ $this->assertSame($input, (new SiteDatabaseEditRow($siteConfigurationProphecy->reveal()))->addData($input));
}
/**
'foo' => 'bar',
]
];
- $this->assertSame($input, (new SiteDatabaseEditRow())->addData($input));
+ $siteConfigurationProphecy = $this->prophesize(SiteConfiguration::class);
+ $this->assertSame($input, (new SiteDatabaseEditRow($siteConfigurationProphecy->reveal()))->addData($input));
}
/**
$this->expectException(\RuntimeException::class);
$this->expectExceptionCode(1520886234);
$siteFinderProphecy = $this->prophesize(SiteFinder::class);
+ $siteConfigurationProphecy = $this->prophesize(SiteConfiguration::class);
GeneralUtility::addInstance(SiteFinder::class, $siteFinderProphecy->reveal());
- (new SiteDatabaseEditRow())->addData($input);
+ (new SiteDatabaseEditRow($siteConfigurationProphecy->reveal()))->addData($input);
}
/**
$siteProphecy->getIdentifier()->willReturn('testident');
$siteConfiguration = $this->prophesize(SiteConfiguration::class);
$siteConfiguration->load('testident')->willReturn($rowData);
- GeneralUtility::addInstance(SiteConfiguration::class, $siteConfiguration->reveal());
$expected = $input;
$expected['databaseRow'] = [
'foo' => 'bar',
];
- $this->assertEquals($expected, (new SiteDatabaseEditRow())->addData($input));
+ $this->assertEquals($expected, (new SiteDatabaseEditRow($siteConfiguration->reveal()))->addData($input));
}
/**
$siteProphecy->getIdentifier()->willReturn('testident');
$siteConfiguration = $this->prophesize(SiteConfiguration::class);
$siteConfiguration->load('testident')->willReturn($rowData);
- GeneralUtility::addInstance(SiteConfiguration::class, $siteConfiguration->reveal());
$this->expectException(\RuntimeException::class);
$this->expectExceptionCode(1520886092);
- (new SiteDatabaseEditRow())->addData($input);
+ (new SiteDatabaseEditRow($siteConfiguration->reveal()))->addData($input);
}
/**
$siteProphecy->getIdentifier()->willReturn('testident');
$siteConfiguration = $this->prophesize(SiteConfiguration::class);
$siteConfiguration->load('testident')->willReturn($rowData);
- GeneralUtility::addInstance(SiteConfiguration::class, $siteConfiguration->reveal());
$this->expectException(\RuntimeException::class);
$this->expectExceptionCode(1520886092);
- (new SiteDatabaseEditRow())->addData($input);
+ (new SiteDatabaseEditRow($siteConfiguration->reveal()))->addData($input);
}
/**
$siteProphecy->getIdentifier()->willReturn('testident');
$siteConfiguration = $this->prophesize(SiteConfiguration::class);
$siteConfiguration->load('testident')->willReturn($rowData);
- GeneralUtility::addInstance(SiteConfiguration::class, $siteConfiguration->reveal());
$expected = $input;
$expected['databaseRow'] = [
'pid' => 0,
];
- $this->assertEquals($expected, (new SiteDatabaseEditRow())->addData($input));
+ $this->assertEquals($expected, (new SiteDatabaseEditRow($siteConfiguration->reveal()))->addData($input));
}
}
use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface;
use TYPO3\CMS\Core\Configuration\Loader\YamlFileLoader;
use TYPO3\CMS\Core\Exception\SiteNotFoundException;
+use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Core\Site\Entity\Site;
use TYPO3\CMS\Core\Utility\GeneralUtility;
*
* @internal
*/
-class SiteConfiguration
+class SiteConfiguration implements SingletonInterface
{
/**
* @var string
*/
protected $cacheIdentifier = 'site-configuration';
+ /**
+ * Cache stores all configuration as Site objects, as long as they haven't been changed.
+ * This drastically improves performance as SiteFinder utilizes SiteConfiguration heavily
+ *
+ * @var array|null
+ */
+ protected $firstLevelCache;
+
/**
* @param string $configPath
*/
*
* @return Site[]
*/
+ public function getAllExistingSites(): array
+ {
+ return $this->firstLevelCache ?? $this->resolveAllExistingSites();
+ }
+
+ /**
+ * Resolve all site objects which have been found in the filesystem.
+ *
+ * @return Site[]
+ */
public function resolveAllExistingSites(): array
{
$sites = [];
$sites[$identifier] = GeneralUtility::makeInstance(Site::class, $identifier, $rootPageId, $configuration);
}
}
+ $this->firstLevelCache = $sites;
return $sites;
}
}
$yamlFileContents = Yaml::dump($configuration, 99, 2);
GeneralUtility::writeFile($fileName, $yamlFileContents);
+ $this->firstLevelCache = null;
$this->getCache()->remove($this->cacheIdentifier);
$this->getCache()->remove('pseudo-sites');
}
throw new \RuntimeException('Unable to rename folder sites/' . $currentIdentifier, 1522491300);
}
$this->getCache()->remove($this->cacheIdentifier);
+ $this->firstLevelCache = null;
}
/**
*/
public function delete(string $siteIdentifier): void
{
- $sites = $this->resolveAllExistingSites();
+ $sites = $this->getAllExistingSites();
if (!isset($sites[$siteIdentifier])) {
throw new SiteNotFoundException('Site configuration named ' . $siteIdentifier . ' not found.', 1522866183);
}
@unlink($fileName);
$this->getCache()->remove($this->cacheIdentifier);
$this->getCache()->remove('pseudo-sites');
+ $this->firstLevelCache = null;
}
/**
/**
* Fetches all existing configurations as Site objects
+ *
+ * @param SiteConfiguration $siteConfiguration
*/
- public function __construct()
+ public function __construct(SiteConfiguration $siteConfiguration = null)
{
- $reader = GeneralUtility::makeInstance(SiteConfiguration::class, Environment::getConfigPath() . '/sites');
- $sites = $reader->resolveAllExistingSites();
+ $siteConfiguration = $siteConfiguration ?? GeneralUtility::makeInstance(
+ SiteConfiguration::class,
+ Environment::getConfigPath() . '/sites'
+ );
+ $sites = $siteConfiguration->getAllExistingSites();
foreach ($sites as $identifier => $site) {
$this->sites[$identifier] = $site;
$this->mappingRootPageIdToIdentifier[$site->getRootPageId()] = $identifier;