<?php namespace Drupal\Core\Plugin; use Drupal\Core\Theme\Component\ComponentMetadata; use Drupal\Core\Render\Component\Exception\InvalidComponentException; /** * Simple value object that contains information about the component. */ class Component extends PluginBase { /** * The component's metadata. * * @var \Drupal\Core\Theme\Component\ComponentMetadata */ public readonly ComponentMetadata $metadata; /** * The component machine name. * * @var string */ public readonly string $machineName; /** * The Twig template for the component. * * @var string */ public readonly string $template; /** * The library definition to be attached with the component. * * @var array */ public readonly array $library; /** * Component constructor. * * @throws \Drupal\Core\Render\Component\Exception\InvalidComponentException */ public function __construct(array $configuration, $plugin_id, $plugin_definition) { parent::__construct($configuration, $plugin_id, $plugin_definition); if (str_contains($plugin_id, '/')) { $message = sprintf('Component ID cannot contain slashes: %s', $plugin_id); throw new InvalidComponentException($message); } $template = $plugin_definition['template'] ?? NULL; if (!$template) { $message = sprintf( 'Unable to find the Twig template for the component "%s".', $plugin_id ); throw new InvalidComponentException($message); } $this->template = $template; $this->machineName = $plugin_definition['machineName']; $this->library = $plugin_definition['library'] ?? []; $this->metadata = new ComponentMetadata( $plugin_definition, $configuration['app_root'], (bool) ($configuration['enforce_schemas'] ?? FALSE) ); } /** * The template path. * * @return string|null * The path to the template. */ public function getTemplatePath(): ?string { return $this->metadata->path . DIRECTORY_SEPARATOR . $this->template; } /** * The auto-computed library name. * * @return string * The library name. */ public function getLibraryName(): string { $library_id = $this->getPluginId(); $library_id = str_replace(':', '--', $library_id); return sprintf('core/components.%s', $library_id); } }