ThemeRegistryLoader.php

Same filename in other branches
  1. 9 core/lib/Drupal/Core/Template/Loader/ThemeRegistryLoader.php
  2. 8.9.x core/lib/Drupal/Core/Template/Loader/ThemeRegistryLoader.php
  3. 11.x core/lib/Drupal/Core/Template/Loader/ThemeRegistryLoader.php

Namespace

Drupal\Core\Template\Loader

File

core/lib/Drupal/Core/Template/Loader/ThemeRegistryLoader.php

View source
<?php

namespace Drupal\Core\Template\Loader;

use Drupal\Core\Theme\Registry;
use Twig\Error\LoaderError;
use Twig\Loader\FilesystemLoader;

/**
 * Loads templates based on information from the Drupal theme registry.
 *
 * Allows for template inheritance based on the currently active template.
 */
class ThemeRegistryLoader extends FilesystemLoader {
    
    /**
     * The theme registry used to determine which template to use.
     *
     * @var \Drupal\Core\Theme\Registry
     */
    protected $themeRegistry;
    
    /**
     * Constructs a new ThemeRegistryLoader object.
     *
     * @param \Drupal\Core\Theme\Registry $theme_registry
     *   The theme registry.
     */
    public function __construct(Registry $theme_registry) {
        $this->themeRegistry = $theme_registry;
    }
    
    /**
     * Finds the path to the requested template.
     *
     * @param string $name
     *   The name of the template to load.
     * @param bool $throw
     *   Whether to throw an exception when an error occurs.
     *
     * @return string|null
     *   The path to the template, or NULL if the template is not found.
     *
     * @throws \Twig\Error\LoaderError
     *   Thrown if a template matching $name cannot be found.
     */
    protected function findTemplate(string $name, bool $throw = TRUE) {
        // Allow for loading based on the Drupal theme registry.
        $hook = str_replace('.html.twig', '', strtr($name, '-', '_'));
        $theme_registry = $this->themeRegistry
            ->getRuntime();
        if ($theme_registry->has($hook)) {
            $info = $theme_registry->get($hook);
            if (isset($info['path'])) {
                $path = $info['path'] . '/' . $name;
            }
            elseif (isset($info['template'])) {
                $path = $info['template'] . '.html.twig';
            }
            if (isset($path) && is_file($path)) {
                return $this->cache[$name] = $path;
            }
        }
        if ($throw) {
            throw new LoaderError(sprintf('Unable to find template "%s" in the Drupal theme registry.', $name));
        }
        return NULL;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getCacheKey(string $name) : string {
        // The parent implementation does unnecessary work that triggers
        // deprecations in PHP 8.1.
        return $this->findTemplate($name) ?: '';
    }

}

Classes

Title Deprecated Summary
ThemeRegistryLoader Loads templates based on information from the Drupal theme registry.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.