class ElementInfoManager
Provides a plugin manager for element plugins.
Hierarchy
- class \Drupal\Component\Plugin\PluginManagerBase implements \Drupal\Component\Plugin\PluginManagerInterface uses \Drupal\Component\Plugin\Discovery\DiscoveryTrait
- class \Drupal\Core\Plugin\DefaultPluginManager implements \Drupal\Component\Plugin\PluginManagerInterface, \Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface, \Drupal\Core\Cache\CacheableDependencyInterface uses \Drupal\Component\Plugin\Discovery\DiscoveryCachedTrait, \Drupal\Core\Cache\UseCacheBackendTrait extends \Drupal\Component\Plugin\PluginManagerBase
- class \Drupal\Core\Render\ElementInfoManager implements \Drupal\Core\Render\ElementInfoManagerInterface uses \Drupal\Core\DependencyInjection\DeprecatedServicePropertyTrait extends \Drupal\Core\Plugin\DefaultPluginManager
 
 
 - class \Drupal\Core\Plugin\DefaultPluginManager implements \Drupal\Component\Plugin\PluginManagerInterface, \Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface, \Drupal\Core\Cache\CacheableDependencyInterface uses \Drupal\Component\Plugin\Discovery\DiscoveryCachedTrait, \Drupal\Core\Cache\UseCacheBackendTrait extends \Drupal\Component\Plugin\PluginManagerBase
 
Expanded class hierarchy of ElementInfoManager
See also
\Drupal\Core\Render\Attribute\RenderElement
\Drupal\Core\Render\Attribute\FormElement
\Drupal\Core\Render\Element\RenderElementBase
\Drupal\Core\Render\Element\FormElementBase
\Drupal\Core\Render\Element\ElementInterface
\Drupal\Core\Render\Element\FormElementInterface
1 file declares its use of ElementInfoManager
- ElementInfoManagerTest.php in core/
tests/ Drupal/ Tests/ Core/ Render/ ElementInfoManagerTest.php  
1 string reference to 'ElementInfoManager'
- core.services.yml in core/
core.services.yml  - core/core.services.yml
 
1 service uses ElementInfoManager
File
- 
              core/
lib/ Drupal/ Core/ Render/ ElementInfoManager.php, line 26  
Namespace
Drupal\Core\RenderView source
class ElementInfoManager extends DefaultPluginManager implements ElementInfoManagerInterface {
  use DeprecatedServicePropertyTrait;
  
  /**
   * Defines deprecated injected properties.
   *
   * @var array
   */
  protected array $deprecatedProperties = [
    'cacheTagInvalidator' => 'cache_tags.invalidator',
  ];
  
  /**
   * Stores the available element information.
   *
   * @var array
   */
  protected $elementInfo;
  
  /**
   * The theme manager.
   *
   * @var \Drupal\Core\Theme\ThemeManagerInterface
   */
  protected $themeManager;
  
  /**
   * The theme handler.
   *
   * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface
   */
  protected $themeHandler;
  
  /**
   * Constructs an ElementInfoManager object.
   *
   * @param \Traversable $namespaces
   *   An object that implements \Traversable which contains the root paths
   *   keyed by the corresponding namespace to look for plugin implementations.
   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
   *   Cache backend instance to use.
   * @param \Drupal\Core\Extension\ThemeHandlerInterface|\Drupal\Core\Cache\CacheTagsInvalidatorInterface $theme_handler
   *   The theme handler.
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler to invoke the alter hook with.
   * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager
   *   The theme manager.
   */
  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ThemeHandlerInterface|CacheTagsInvalidatorInterface $theme_handler, ModuleHandlerInterface $module_handler, ThemeManagerInterface $theme_manager) {
    $this->setCacheBackend($cache_backend, 'element_info');
    $this->themeManager = $theme_manager;
    if ($theme_handler instanceof CacheTagsInvalidatorInterface) {
      @trigger_error('Calling ' . __METHOD__ . '() with the $cache_tag_invalidator argument is deprecated in drupal:10.2.0 and will be removed in drupal:11.0.0. Pass $theme_handler instead. See https://www.drupal.org/node/3355227', E_USER_DEPRECATED);
      $theme_handler = \Drupal::service('theme_handler');
    }
    $this->themeHandler = $theme_handler;
    parent::__construct('Element', $namespaces, $module_handler, 'Drupal\\Core\\Render\\Element\\ElementInterface', RenderElement::class, 'Drupal\\Core\\Render\\Annotation\\RenderElement');
    $this->alterInfo('element_plugin');
  }
  
  /**
   * {@inheritdoc}
   */
  public function getInfo($type) {
    $theme_name = $this->themeManager
      ->getActiveTheme()
      ->getName();
    if (!isset($this->elementInfo[$theme_name])) {
      $this->elementInfo[$theme_name] = $this->buildInfo($theme_name);
    }
    $info = $this->elementInfo[$theme_name][$type] ?? [];
    $info['#defaults_loaded'] = TRUE;
    return $info;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getInfoProperty($type, $property_name, $default = NULL) {
    $info = $this->getInfo($type);
    return $info[$property_name] ?? $default;
  }
  
  /**
   * Builds up all element information.
   *
   * @param string $theme_name
   *   The theme name.
   *
   * @return array
   */
  protected function buildInfo($theme_name) {
    // Get cached definitions.
    $cid = $this->getCid($theme_name);
    if ($cache = $this->cacheBackend
      ->get($cid)) {
      return $cache->data;
    }
    // Otherwise, rebuild and cache.
    $info = [];
    $previous_error_handler = set_error_handler(function ($severity, $message, $file, $line) use (&$previous_error_handler) {
      // Ignore deprecations while building element information.
      if ($severity === E_USER_DEPRECATED) {
        // Don't execute PHP internal error handler.
        return TRUE;
      }
      if ($previous_error_handler) {
        return $previous_error_handler($severity, $message, $file, $line);
      }
    });
    foreach ($this->getDefinitions() as $element_type => $definition) {
      $element = $this->createInstance($element_type);
      $element_info = $element->getInfo();
      // If this is element is to be used exclusively in a form, denote that it
      // will receive input, and assign the value callback.
      if ($element instanceof FormElementInterface) {
        $element_info['#input'] = TRUE;
        $element_info['#value_callback'] = [
          $definition['class'],
          'valueCallback',
        ];
      }
      $info[$element_type] = $element_info;
    }
    restore_error_handler();
    foreach ($info as $element_type => $element) {
      $info[$element_type]['#type'] = $element_type;
    }
    // Allow modules to alter the element type defaults.
    $this->moduleHandler
      ->alter('element_info', $info);
    $this->themeManager
      ->alter('element_info', $info);
    $this->cacheBackend
      ->set($cid, $info);
    return $info;
  }
  
  /**
   * {@inheritdoc}
   *
   * @return \Drupal\Core\Render\Element\ElementInterface
   */
  public function createInstance($plugin_id, array $configuration = []) {
    return parent::createInstance($plugin_id, $configuration);
  }
  
  /**
   * {@inheritdoc}
   */
  public function clearCachedDefinitions() {
    $this->elementInfo = NULL;
    $cids = [];
    foreach ($this->themeHandler
      ->listInfo() as $theme_name => $info) {
      $cids[] = $this->getCid($theme_name);
    }
    $this->cacheBackend
      ->deleteMultiple($cids);
    parent::clearCachedDefinitions();
  }
  
  /**
   * Returns the CID used to cache the element info.
   *
   * @param string $theme_name
   *   The theme name.
   *
   * @return string
   */
  protected function getCid($theme_name) {
    return 'element_info_build:' . $theme_name;
  }
}
Members
| Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides | 
|---|---|---|---|---|---|
| DefaultPluginManager::$additionalAnnotationNamespaces | protected | property | Additional annotation namespaces. | ||
| DefaultPluginManager::$alterHook | protected | property | Name of the alter hook if one should be invoked. | ||
| DefaultPluginManager::$cacheKey | protected | property | The cache key. | ||
| DefaultPluginManager::$cacheTags | protected | property | An array of cache tags to use for the cached definitions. | ||
| DefaultPluginManager::$defaults | protected | property | A set of defaults to be referenced by $this->processDefinition(). | 11 | |
| DefaultPluginManager::$moduleExtensionList | protected | property | The module extension list. | ||
| DefaultPluginManager::$moduleHandler | protected | property | The module handler to invoke the alter hook. | 1 | |
| DefaultPluginManager::$namespaces | protected | property | An object of root paths that are traversable. | ||
| DefaultPluginManager::$pluginDefinitionAnnotationName | protected | property | The name of the annotation that contains the plugin definition. | ||
| DefaultPluginManager::$pluginDefinitionAttributeName | protected | property | The name of the attribute that contains the plugin definition. | ||
| DefaultPluginManager::$pluginInterface | protected | property | The interface each plugin should implement. | 1 | |
| DefaultPluginManager::$subdir | protected | property | The subdirectory within a namespace to look for plugins. | ||
| DefaultPluginManager::alterDefinitions | protected | function | Invokes the hook to alter the definitions if the alter hook is set. | 4 | |
| DefaultPluginManager::alterInfo | protected | function | Sets the alter hook name. | ||
| DefaultPluginManager::extractProviderFromDefinition | protected | function | Extracts the provider from a plugin definition. | ||
| DefaultPluginManager::findDefinitions | protected | function | Finds plugin definitions. | 7 | |
| DefaultPluginManager::getCacheContexts | public | function | The cache contexts associated with this object. | Overrides CacheableDependencyInterface::getCacheContexts | |
| DefaultPluginManager::getCachedDefinitions | protected | function | Returns the cached plugin definitions of the decorated discovery class. | ||
| DefaultPluginManager::getCacheMaxAge | public | function | The maximum age for which this object may be cached. | Overrides CacheableDependencyInterface::getCacheMaxAge | |
| DefaultPluginManager::getCacheTags | public | function | The cache tags associated with this object. | Overrides CacheableDependencyInterface::getCacheTags | |
| DefaultPluginManager::getDefinitions | public | function | Gets the definition of all plugins for this type. | Overrides DiscoveryTrait::getDefinitions | 2 | 
| DefaultPluginManager::getDiscovery | protected | function | Gets the plugin discovery. | Overrides PluginManagerBase::getDiscovery | 15 | 
| DefaultPluginManager::getFactory | protected | function | Gets the plugin factory. | Overrides PluginManagerBase::getFactory | |
| DefaultPluginManager::processDefinition | public | function | Performs extra processing on plugin definitions. | 14 | |
| DefaultPluginManager::providerExists | protected | function | Determines if the provider of a definition exists. | 4 | |
| DefaultPluginManager::setCacheBackend | public | function | Initialize the cache backend. | ||
| DefaultPluginManager::setCachedDefinitions | protected | function | Sets a cache of plugin definitions for the decorated discovery class. | ||
| DefaultPluginManager::useCaches | public | function | Disable the use of caches. | Overrides CachedDiscoveryInterface::useCaches | 1 | 
| DeprecatedServicePropertyTrait::__get | public | function | Allows to access deprecated/removed properties. | ||
| DiscoveryCachedTrait::$definitions | protected | property | Cached definitions array. | 1 | |
| DiscoveryCachedTrait::getDefinition | public | function | Overrides DiscoveryTrait::getDefinition | 3 | |
| DiscoveryTrait::doGetDefinition | protected | function | Gets a specific plugin definition. | ||
| DiscoveryTrait::hasDefinition | public | function | |||
| ElementInfoManager::$deprecatedProperties | protected | property | Defines deprecated injected properties. | ||
| ElementInfoManager::$elementInfo | protected | property | Stores the available element information. | 1 | |
| ElementInfoManager::$themeHandler | protected | property | The theme handler. | ||
| ElementInfoManager::$themeManager | protected | property | The theme manager. | ||
| ElementInfoManager::buildInfo | protected | function | Builds up all element information. | ||
| ElementInfoManager::clearCachedDefinitions | public | function | Clears static and persistent plugin definition caches. | Overrides DefaultPluginManager::clearCachedDefinitions | |
| ElementInfoManager::createInstance | public | function | Overrides PluginManagerBase::createInstance | ||
| ElementInfoManager::getCid | protected | function | Returns the CID used to cache the element info. | ||
| ElementInfoManager::getInfo | public | function | Retrieves the default properties for the defined element type. | Overrides ElementInfoManagerInterface::getInfo | |
| ElementInfoManager::getInfoProperty | public | function | Retrieves a single property for the defined element type. | Overrides ElementInfoManagerInterface::getInfoProperty | |
| ElementInfoManager::__construct | public | function | Constructs an ElementInfoManager object. | Overrides DefaultPluginManager::__construct | |
| PluginManagerBase::$discovery | protected | property | The object that discovers plugins managed by this manager. | ||
| PluginManagerBase::$factory | protected | property | The object that instantiates plugins managed by this manager. | ||
| PluginManagerBase::$mapper | protected | property | The object that returns the preconfigured plugin instance appropriate for a particular runtime condition. | ||
| PluginManagerBase::getFallbackPluginId | protected | function | Gets a fallback id for a missing plugin. | 6 | |
| PluginManagerBase::getInstance | public | function | Gets or creates a plugin instance that satisfies the given options. | Overrides MapperInterface::getInstance | 6 | 
| PluginManagerBase::handlePluginNotFound | protected | function | Allows plugin managers to specify custom behavior if a plugin is not found. | 1 | |
| UseCacheBackendTrait::$cacheBackend | protected | property | Cache backend instance. | ||
| UseCacheBackendTrait::$useCaches | protected | property | Flag whether caches should be used or skipped. | ||
| UseCacheBackendTrait::cacheGet | protected | function | Fetches from the cache backend, respecting the use caches flag. | ||
| UseCacheBackendTrait::cacheSet | protected | function | Stores data in the persistent cache, respecting the use caches flag. | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.