You are here

class Extension in Drupal 9

Same name in this branch
  1. 9 core/lib/Drupal/Core/Extension/Extension.php \Drupal\Core\Extension\Extension
  2. 9 core/modules/system/src/Plugin/migrate/source/Extension.php \Drupal\system\Plugin\migrate\source\Extension
Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Extension/Extension.php \Drupal\Core\Extension\Extension

Defines an extension (file) object.

This class does not implement the Serializable interface since problems occurred when using the serialize method.

Hierarchy

Expanded class hierarchy of Extension

See also

https://bugs.php.net/bug.php?id=66052

40 files declare their use of Extension
advisory_feed_test.module in core/modules/system/tests/modules/advisory_feed_test/advisory_feed_test.module
Module for testing the display of security advisories.
config_translation_test.module in core/modules/config_translation/tests/modules/config_translation_test/config_translation_test.module
Configuration Translation Test module.
DrupalKernel.php in core/lib/Drupal/Core/DrupalKernel.php
ExtensionDiscoveryTest.php in core/tests/Drupal/Tests/Core/Extension/ExtensionDiscoveryTest.php
ExtensionListTest.php in core/tests/Drupal/Tests/Core/Extension/ExtensionListTest.php

... See full list

2 string references to 'Extension'
FileViewsData::getViewsData in core/modules/file/src/FileViewsData.php
Returns views data for the entity type.
image.schema.yml in core/modules/image/config/schema/image.schema.yml
core/modules/image/config/schema/image.schema.yml

File

core/lib/Drupal/Core/Extension/Extension.php, line 13

Namespace

Drupal\Core\Extension
View source
class Extension {

  /**
   * The type of the extension (e.g., 'module').
   *
   * @var string
   */
  protected $type;

  /**
   * The relative pathname of the extension (e.g., 'core/modules/node/node.info.yml').
   *
   * @var string
   */
  protected $pathname;

  /**
   * The filename of the main extension file (e.g., 'node.module').
   *
   * @var string|null
   */
  protected $filename;

  /**
   * An SplFileInfo instance for the extension's info file.
   *
   * Note that SplFileInfo is a PHP resource and resources cannot be serialized.
   *
   * @var \SplFileInfo
   */
  protected $splFileInfo;

  /**
   * The app root.
   *
   * @var string
   */
  protected $root;

  /**
   * Constructs a new Extension object.
   *
   * @param string $root
   *   The app root.
   * @param string $type
   *   The type of the extension; e.g., 'module'.
   * @param string $pathname
   *   The relative path and filename of the extension's info file; e.g.,
   *   'core/modules/node/node.info.yml'.
   * @param string $filename
   *   (optional) The filename of the main extension file; e.g., 'node.module'.
   */
  public function __construct($root, $type, $pathname, $filename = NULL) {

    // @see \Drupal\Core\Theme\ThemeInitialization::getActiveThemeByName()
    assert($pathname === 'core/core.info.yml' || $pathname[0] !== '/' && file_exists($root . '/' . $pathname), sprintf('The file specified by the given app root, relative path and file name (%s) do not exist.', $root . '/' . $pathname));
    $this->root = $root;
    $this->type = $type;
    $this->pathname = $pathname;
    $this->filename = $filename;
  }

  /**
   * Returns the type of the extension.
   *
   * @return string
   */
  public function getType() {
    return $this->type;
  }

  /**
   * Returns the internal name of the extension.
   *
   * @return string
   */
  public function getName() {
    return basename($this->pathname, '.info.yml');
  }

  /**
   * Returns the relative path of the extension.
   *
   * @return string
   */
  public function getPath() {
    return dirname($this->pathname);
  }

  /**
   * Returns the relative path and filename of the extension's info file.
   *
   * @return string
   */
  public function getPathname() {
    return $this->pathname;
  }

  /**
   * Returns the filename of the extension's info file.
   *
   * @return string
   */
  public function getFilename() {
    return basename($this->pathname);
  }

  /**
   * Returns the relative path of the main extension file, if any.
   *
   * @return string|null
   */
  public function getExtensionPathname() {
    if ($this->filename) {
      return $this
        ->getPath() . '/' . $this->filename;
    }
  }

  /**
   * Returns the name of the main extension file, if any.
   *
   * @return string|null
   */
  public function getExtensionFilename() {
    return $this->filename;
  }

  /**
   * Loads the main extension file, if any.
   *
   * @return bool
   *   TRUE if this extension has a main extension file, FALSE otherwise.
   */
  public function load() {
    if ($this->filename) {
      include_once $this->root . '/' . $this
        ->getPath() . '/' . $this->filename;
      return TRUE;
    }
    return FALSE;
  }

  /**
   * Re-routes method calls to SplFileInfo.
   *
   * Offers all SplFileInfo methods to consumers; e.g., $extension->getMTime().
   */
  public function __call($method, array $args) {
    if (!isset($this->splFileInfo)) {
      $this->splFileInfo = new \SplFileInfo($this->root . '/' . $this->pathname);
    }
    return call_user_func_array([
      $this->splFileInfo,
      $method,
    ], $args);
  }

  /**
   * Magic method implementation to serialize the extension object.
   *
   * @return array
   *   The names of all variables that should be serialized.
   */
  public function __sleep() {

    // @todo \Drupal\Core\Extension\ThemeExtensionList is adding custom
    //   properties to the Extension object.
    $properties = get_object_vars($this);

    // Don't serialize the app root, since this could change if the install is
    // moved. Don't serialize splFileInfo because it can not be.
    unset($properties['splFileInfo'], $properties['root']);
    return array_keys($properties);
  }

  /**
   * Magic method implementation to unserialize the extension object.
   */
  public function __wakeup() {

    // Get the app root from the container. While compiling the container we
    // have to discover all the extension service files in
    // \Drupal\Core\DrupalKernel::initializeServiceProviders(). This results in
    // creating extension objects before the container has the kernel.
    // Specifically, this occurs during the call to
    // \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory().
    $container = \Drupal::hasContainer() ? \Drupal::getContainer() : FALSE;
    $this->root = $container && $container
      ->hasParameter('app.root') ? $container
      ->getParameter('app.root') : DRUPAL_ROOT;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
Extension::$filename protected property The filename of the main extension file (e.g., 'node.module').
Extension::$pathname protected property The relative pathname of the extension (e.g., 'core/modules/node/node.info.yml').
Extension::$root protected property The app root.
Extension::$splFileInfo protected property An SplFileInfo instance for the extension's info file.
Extension::$type protected property The type of the extension (e.g., 'module').
Extension::getExtensionFilename public function Returns the name of the main extension file, if any.
Extension::getExtensionPathname public function Returns the relative path of the main extension file, if any.
Extension::getFilename public function Returns the filename of the extension's info file.
Extension::getName public function Returns the internal name of the extension.
Extension::getPath public function Returns the relative path of the extension.
Extension::getPathname public function Returns the relative path and filename of the extension's info file.
Extension::getType public function Returns the type of the extension.
Extension::load public function Loads the main extension file, if any.
Extension::__call public function Re-routes method calls to SplFileInfo.
Extension::__construct public function Constructs a new Extension object.
Extension::__sleep public function Magic method implementation to serialize the extension object.
Extension::__wakeup public function Magic method implementation to unserialize the extension object.