Files

126 lines
6.0 KiB
PHP

<?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\Extbase\Configuration;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Http\ApplicationType;
use TYPO3\CMS\Extbase\Configuration\Exception\NoServerRequestGivenException;
/**
* Generic ConfigurationManager implementation. Uses BackendConfigurationManager
* or FrontendConfigurationManager depending on request type.
*
* @internal only to be used within Extbase, not part of TYPO3 Core API.
*/
class ConfigurationManager implements ConfigurationManagerInterface
{
private ?ServerRequestInterface $request = null;
private array $configuration = [];
/**
* @todo Use runtime cache
*/
private array $feConfigCache = [];
public function __construct(
private readonly FrontendConfigurationManager $feConfigManager,
private readonly BackendConfigurationManager $beConfigManager,
) {}
public function setRequest(ServerRequestInterface $request): void
{
$this->request = $request;
}
public function setConfiguration(array $configuration = []): void
{
$this->configuration = $configuration;
$this->feConfigCache = [];
}
/**
* Returns the specified configuration.
* The actual configuration will be merged from different sources in a defined order.
*
* You can get the following types of configuration invoking:
* CONFIGURATION_TYPE_SETTINGS: Extbase settings
* CONFIGURATION_TYPE_FRAMEWORK: the current module/plugin settings
* CONFIGURATION_TYPE_FULL_TYPOSCRIPT: a raw TS array
*
* Note that this is a low level method and only makes sense to be used by Extbase internally.
*
* @param string $configurationType The kind of configuration to fetch - must be one of the CONFIGURATION_TYPE_* constants
* @param string|null $extensionName if specified, the configuration for the given extension will be returned.
* @param string|null $pluginName if specified, the configuration for the given plugin will be returned.
* @return array The configuration
*/
public function getConfiguration(string $configurationType, ?string $extensionName = null, ?string $pluginName = null): array
{
$request = $this->request;
$configuration = $this->configuration;
if ($request === null && ($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface) {
// @todo: deprecate
$request = $GLOBALS['TYPO3_REQUEST'];
}
if ($request === null) {
// This is a *specific* exception (as opposed to a global one) to allow consumers to opt-out
// of a Request dependency. The extbase persistence layer is an example: It can be useful to
// only have a loose Request / TypoScript dependency in it, and the TS config values / toggles
// used within the persistence layer are not crucially important and can fall back to hard
// coded defaults.
// Note custom extensions should typically not catch this exception. The dependency to
// the current request is still an important dependency in most extbase places, e.g. in
// controller and view related code.
throw new NoServerRequestGivenException('No request given. ConfigurationManager has not been initialized properly.', 1721920500);
}
if (ApplicationType::fromRequest($request)->isFrontend()) {
if ($configurationType === self::CONFIGURATION_TYPE_FULL_TYPOSCRIPT) {
return $this->feConfigManager->getTypoScriptSetup($request);
}
// @todo Throw if empty to not end up with '_': Invalid setup/call!
$feConfigCacheKey = strtolower(
($extensionName ?? $configuration['extensionName'] ?? null)
. '_'
. ($pluginName ?? $configuration['pluginName'] ?? null)
);
if ($configurationType === self::CONFIGURATION_TYPE_SETTINGS) {
if (isset($this->feConfigCache[$feConfigCacheKey])) {
return $this->feConfigCache[$feConfigCacheKey]['settings'] ?? [];
}
$this->feConfigCache[$feConfigCacheKey] = $this->feConfigManager->getConfiguration($request, $this->configuration, $extensionName, $pluginName);
return $this->feConfigCache[$feConfigCacheKey]['settings'] ?? [];
}
if ($configurationType === self::CONFIGURATION_TYPE_FRAMEWORK) {
if (isset($this->feConfigCache[$feConfigCacheKey])) {
return $this->feConfigCache[$feConfigCacheKey];
}
$this->feConfigCache[$feConfigCacheKey] = $this->feConfigManager->getConfiguration($request, $this->configuration, $extensionName, $pluginName);
return $this->feConfigCache[$feConfigCacheKey];
}
throw new \RuntimeException('Invalid configuration type "' . $configurationType . '"', 1206031879);
} else {
return match ($configurationType) {
self::CONFIGURATION_TYPE_SETTINGS => $this->beConfigManager->getConfiguration($request, $this->configuration, $extensionName, $pluginName)['settings'] ?? [],
self::CONFIGURATION_TYPE_FRAMEWORK => $this->beConfigManager->getConfiguration($request, $this->configuration, $extensionName, $pluginName),
self::CONFIGURATION_TYPE_FULL_TYPOSCRIPT => $this->beConfigManager->getTypoScriptSetup($request),
default => throw new \RuntimeException('Invalid configuration type "' . $configurationType . '"', 1721928055),
};
}
}
}