ThemeSettingsProvider.php
Namespace
Drupal\Core\ExtensionFile
- 
              core/
lib/ Drupal/ Core/ Extension/ ThemeSettingsProvider.php  
View source
<?php
declare (strict_types=1);
namespace Drupal\Core\Extension;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Config\StorageException;
use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Core\Theme\ThemeInitializationInterface;
use Drupal\Core\Theme\ThemeManagerInterface;
use Drupal\Core\Theme\ThemeSettings;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
/**
 * Default implementation of the theme settings provider service.
 */
class ThemeSettingsProvider {
  
  /**
   * An array of default theme features.
   *
   * @see \Drupal\Core\Extension\ThemeExtensionList::$defaults
   */
  public const DEFAULT_THEME_FEATURES = [
    'favicon',
    'logo',
    'node_user_picture',
    'comment_user_picture',
    'comment_user_verification',
  ];
  
  /**
   * Builds a new service instance.
   */
  public function __construct(protected readonly ThemeManagerInterface $themeManager, protected readonly ThemeInitializationInterface $themeInitialization, protected readonly ThemeHandlerInterface $themeHandler, protected readonly ConfigFactoryInterface $configFactory, protected readonly FileUrlGeneratorInterface $fileUrlGenerator, #[Autowire(service: 'cache.memory')] protected readonly CacheBackendInterface $memoryCache) {
  }
  
  /**
   * {@inheritdoc}
   */
  public function getSetting(string $setting_name, ?string $theme = NULL) : mixed {
    // If no key is given, use the current theme if we can determine it.
    if (!isset($theme)) {
      $theme = $this->themeManager
        ->getActiveTheme()
        ->getName();
    }
    $cid = 'theme_settings:' . $theme;
    $cacheItem = $this->memoryCache
      ->get($cid);
    if ($cacheItem) {
      /** @var \Drupal\Core\Theme\ThemeSettings $themeSettings */
      $themeSettings = $cacheItem->data;
    }
    else {
      $themeSettings = $this->buildThemeSettings($theme);
      $this->memoryCache
        ->set($cid, $themeSettings, tags: [
        'config:core.extension',
        'config:system.theme.global',
        sprintf('config:%s.settings', $theme),
      ]);
    }
    return $themeSettings->get($setting_name);
  }
  
  /**
   * Build a ThemeSettings object for a given theme.
   */
  protected function buildThemeSettings(string $theme) : ThemeSettings {
    // Create a theme settings object.
    $themeSettings = new ThemeSettings($theme);
    // Get the global settings from configuration.
    $themeSettings->setData($this->configFactory
      ->get('system.theme.global')
      ->get());
    // Get the values for the theme-specific settings from the .info.yml files
    // of the theme and all its base themes.
    $themes = $this->themeHandler
      ->listInfo();
    if (isset($themes[$theme])) {
      $themeObject = $themes[$theme];
      // Retrieve configured theme-specific settings, if any.
      try {
        if ($themeConfigSettings = $this->configFactory
          ->get($theme . '.settings')
          ->get()) {
          $themeSettings->merge($themeConfigSettings);
        }
      } catch (StorageException) {
      }
      // If the theme does not support a particular feature, override the
      // global setting and set the value to NULL.
      if (!empty($themeObject->info['features'])) {
        foreach (self::DEFAULT_THEME_FEATURES as $feature) {
          if (!in_array($feature, $themeObject->info['features'])) {
            $themeSettings->set('features.' . $feature, NULL);
          }
        }
      }
      // Generate the path to the logo image.
      if ($themeSettings->get('logo.use_default')) {
        $logo = $this->themeInitialization
          ->getActiveThemeByName($theme)
          ->getLogo();
        $themeSettings->set('logo.url', $this->fileUrlGenerator
          ->generateString($logo));
      }
      elseif ($logo_path = $themeSettings->get('logo.path')) {
        $themeSettings->set('logo.url', $this->fileUrlGenerator
          ->generateString($logo_path));
      }
      // Generate the path to the favicon.
      if ($themeSettings->get('features.favicon')) {
        $faviconPath = $themeSettings->get('favicon.path');
        if ($themeSettings->get('favicon.use_default')) {
          if (file_exists($favicon = $themeObject->getPath() . '/favicon.ico')) {
            $themeSettings->set('favicon.url', $this->fileUrlGenerator
              ->generateString($favicon));
          }
          else {
            $themeSettings->set('favicon.url', $this->fileUrlGenerator
              ->generateString('core/misc/favicon.ico'));
          }
        }
        elseif ($faviconPath) {
          $themeSettings->set('favicon.url', $this->fileUrlGenerator
            ->generateString($faviconPath));
        }
        else {
          $themeSettings->set('features.favicon', FALSE);
        }
      }
    }
    return $themeSettings;
  }
}
Classes
| Title | Deprecated | Summary | 
|---|---|---|
| ThemeSettingsProvider | Default implementation of the theme settings provider service. | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.