class DatabaseDriverList

Same name and namespace in other branches
  1. 11.x core/lib/Drupal/Core/Extension/DatabaseDriverList.php \Drupal\Core\Extension\DatabaseDriverList

Provides a list of available database drivers.

@internal This class is not yet stable and therefore there are no guarantees that the internal implementations including constructor signature and protected properties / methods will not change over time. This will be reviewed after https://www.drupal.org/project/drupal/issues/2940481

Hierarchy

Expanded class hierarchy of DatabaseDriverList

4 files declare their use of DatabaseDriverList
Database.php in core/lib/Drupal/Core/Database/Database.php
DatabaseTest.php in core/tests/Drupal/Tests/Core/Database/DatabaseTest.php
DriverModuleMissingDependenciesTest.php in core/tests/Drupal/Tests/Core/Database/DriverModuleMissingDependenciesTest.php
SiteSettingsForm.php in core/lib/Drupal/Core/Installer/Form/SiteSettingsForm.php
1 string reference to 'DatabaseDriverList'
core.services.yml in core/core.services.yml
core/core.services.yml
1 service uses DatabaseDriverList
extension.list.database_driver in core/core.services.yml
Drupal\Core\Extension\DatabaseDriverList

File

core/lib/Drupal/Core/Extension/DatabaseDriverList.php, line 17

Namespace

Drupal\Core\Extension
View source
class DatabaseDriverList extends ExtensionList {
  
  /**
   * The namespace of core's MySql database driver.
   */
  protected const CORE_MYSQL_DRIVER_NAMESPACE = 'Drupal\\mysql\\Driver\\Database\\mysql';
  
  /**
   * Determines whether test drivers shall be included in the discovery.
   *
   * If FALSE, all 'tests' directories are excluded from the search. If NULL,
   * it will be determined by the 'extension_discovery_scan_tests' setting.
   */
  private ?bool $includeTestDrivers = NULL;
  
  /**
   * Constructs a new instance.
   *
   * @param string $root
   *   The app root.
   * @param string $type
   *   The extension type.
   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
   *   The cache.
   */
  public function __construct($root, $type, CacheBackendInterface $cache) {
    $this->root = $root;
    $this->type = $type;
    $this->cache = $cache;
  }
  
  /**
   * Determines whether test drivers shall be included in the discovery.
   *
   * @param bool|null $includeTestDrivers
   *   Whether to include test extensions. If FALSE, all 'tests' directories
   *   are excluded in the search. If NULL, it will be determined by the
   *   'extension_discovery_scan_tests' setting.
   *
   * @return $this
   */
  public function includeTestDrivers(?bool $includeTestDrivers) : static {
    $this->includeTestDrivers = $includeTestDrivers;
    return $this;
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getExtensionDiscovery() {
    return new ExtensionDiscovery($this->root, FALSE);
  }
  
  /**
   * {@inheritdoc}
   */
  protected function doScanExtensions() {
    return $this->getExtensionDiscovery()
      ->scan('module', $this->includeTestDrivers);
  }
  
  /**
   * {@inheritdoc}
   */
  protected function doList() : array {
    // Determine the modules that contain at least one installable database
    // driver.
    $discoveredModules = $this->doScanExtensions();
    $drivers = [];
    foreach ($discoveredModules as $module) {
      $moduleDriverDirectory = $this->root . DIRECTORY_SEPARATOR . $module->getPath() . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'Driver' . DIRECTORY_SEPARATOR . 'Database';
      if (is_dir($moduleDriverDirectory)) {
        // Use directory iterator to avoid services.
        $directoryIterator = new \DirectoryIterator($moduleDriverDirectory);
        foreach ($directoryIterator as $fileInfo) {
          if ($fileInfo->isDir() && !$fileInfo->isDot() && file_exists($moduleDriverDirectory . DIRECTORY_SEPARATOR . $fileInfo->getFilename() . DIRECTORY_SEPARATOR . 'Install' . DIRECTORY_SEPARATOR . 'Tasks.php')) {
            $databaseDriver = new DatabaseDriver($this->root, $module, $fileInfo->getFilename(), $discoveredModules);
            $drivers[$databaseDriver->getName()] = $databaseDriver;
          }
        }
      }
    }
    return $drivers;
  }
  
  /**
   * Returns the list of installable database drivers.
   *
   * @return \Drupal\Core\Extension\DatabaseDriver[]
   *   An array of installable database driver extension objects.
   */
  public function getInstallableList() : array {
    $installableDrivers = [];
    foreach ($this->getList() as $name => $driver) {
      if ($driver->getInstallTasks()
        ->installable()) {
        $installableDrivers[$name] = $driver;
      }
    }
    // Usability: unconditionally put core MySQL driver on top.
    if (isset($installableDrivers[static::CORE_MYSQL_DRIVER_NAMESPACE])) {
      $mysqlDriver = $installableDrivers[static::CORE_MYSQL_DRIVER_NAMESPACE];
      unset($installableDrivers[static::CORE_MYSQL_DRIVER_NAMESPACE]);
      $installableDrivers = [
        static::CORE_MYSQL_DRIVER_NAMESPACE => $mysqlDriver,
      ] + $installableDrivers;
    }
    return $installableDrivers;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getName($extension_name) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function get($extension_name) {
    if (!str_contains($extension_name, "\\")) {
      @trigger_error("Passing a database driver name '{$extension_name}' to " . __METHOD__ . '() is deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. Pass a database driver namespace instead. See https://www.drupal.org/node/3258175', E_USER_DEPRECATED);
      return $this->getFromDriverName($extension_name);
    }
    return parent::get($extension_name);
  }
  
  /**
   * Returns the first available driver extension by the driver name.
   *
   * @param string $driverName
   *   The database driver name.
   *
   * @return \Drupal\Core\Extension\DatabaseDriver
   *   The driver extension.
   *
   * @throws \Drupal\Core\Extension\Exception\UnknownExtensionException
   *   When no matching driver extension can be found.
   *
   * @deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. Use
   *   DatabaseDriverList::get() instead, passing a database driver namespace.
   *
   * @see https://www.drupal.org/node/3258175
   */
  public function getFromDriverName(string $driverName) : DatabaseDriver {
    @trigger_error(__METHOD__ . '() is deprecated in drupal:10.2.0 and is removed from drupal:11.0.0. Use DatabaseDriverList::get() instead, passing a database driver namespace. See https://www.drupal.org/node/3258175', E_USER_DEPRECATED);
    foreach ($this->getList() as $extensionName => $driver) {
      $namespaceParts = explode('\\', $extensionName);
      if (end($namespaceParts) === $driverName) {
        return parent::get($extensionName);
      }
    }
    throw new UnknownExtensionException("Could not find a database driver named '{$driverName}' in any module");
  }
  
  /**
   * {@inheritdoc}
   */
  public function getExtensionInfo($extension_name) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function getAllAvailableInfo() {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  protected function getInstalledExtensionNames() {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function getAllInstalledInfo() {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  protected function recalculateInfo() {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function getPathNames() {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  protected function recalculatePathNames() {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function setPathname($extension_name, $pathname) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function getPathname($extension_name) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function getPath($extension_name) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  protected function createExtensionInfo(Extension $extension) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public function checkIncompatibility($name) {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }
  
  /**
   * {@inheritdoc}
   */
  public static function sortByName(Extension $a, Extension $b) : int {
    throw new \LogicException(__METHOD__ . '() is not implemented');
  }

}

Members

Title Sort descending Deprecated Modifiers Object type Summary Overriden Title Overrides
DatabaseDriverList::$includeTestDrivers private property Determines whether test drivers shall be included in the discovery.
DatabaseDriverList::checkIncompatibility public function Tests the compatibility of an extension. Overrides ExtensionList::checkIncompatibility
DatabaseDriverList::CORE_MYSQL_DRIVER_NAMESPACE protected constant The namespace of core's MySql database driver.
DatabaseDriverList::createExtensionInfo protected function Creates the info value for an extension object. Overrides ExtensionList::createExtensionInfo
DatabaseDriverList::doList protected function Builds the list of extensions. Overrides ExtensionList::doList
DatabaseDriverList::doScanExtensions protected function Scans the available extensions. Overrides ExtensionList::doScanExtensions
DatabaseDriverList::get public function Returns a single extension. Overrides ExtensionList::get
DatabaseDriverList::getAllAvailableInfo public function Returns an array of info files information of available extensions. Overrides ExtensionList::getAllAvailableInfo
DatabaseDriverList::getAllInstalledInfo public function Returns an array of info files information of installed extensions. Overrides ExtensionList::getAllInstalledInfo
DatabaseDriverList::getExtensionDiscovery protected function Returns the extension discovery. Overrides ExtensionList::getExtensionDiscovery
DatabaseDriverList::getExtensionInfo public function Returns information about a specified extension. Overrides ExtensionList::getExtensionInfo
DatabaseDriverList::getFromDriverName Deprecated public function Returns the first available driver extension by the driver name.
DatabaseDriverList::getInstallableList public function Returns the list of installable database drivers.
DatabaseDriverList::getInstalledExtensionNames protected function Returns a list of machine names of installed extensions. Overrides ExtensionList::getInstalledExtensionNames
DatabaseDriverList::getName public function Returns the human-readable name of the extension. Overrides ExtensionList::getName
DatabaseDriverList::getPath public function Gets the path to an extension of a specific type (module, theme, etc.). Overrides ExtensionList::getPath
DatabaseDriverList::getPathname public function Gets the info file path for an extension. Overrides ExtensionList::getPathname
DatabaseDriverList::getPathNames public function Returns a list of extension file paths keyed by machine name. Overrides ExtensionList::getPathNames
DatabaseDriverList::includeTestDrivers public function Determines whether test drivers shall be included in the discovery.
DatabaseDriverList::recalculateInfo protected function Generates the information from .info.yml files for extensions of this type. Overrides ExtensionList::recalculateInfo
DatabaseDriverList::recalculatePathNames protected function Generates a sorted list of .info.yml file locations for all extensions. Overrides ExtensionList::recalculatePathNames
DatabaseDriverList::setPathname public function Sets the pathname for an extension. Overrides ExtensionList::setPathname
DatabaseDriverList::sortByName public static function Array sorting callback; sorts extensions by their name. Overrides ExtensionList::sortByName
DatabaseDriverList::__construct public function Constructs a new instance. Overrides ExtensionList::__construct
ExtensionList::$addedPathNames protected property A list of extension folder names directly added in code (not discovered).
ExtensionList::$cache protected property The cache.
ExtensionList::$defaults protected property Default values to be merged into *.info.yml file arrays. 4
ExtensionList::$extensionInfo protected property Static caching for extension info.
ExtensionList::$extensions protected property The cached extensions.
ExtensionList::$infoParser protected property The info parser.
ExtensionList::$installProfile protected property The install profile used by the site.
ExtensionList::$moduleHandler protected property The module handler.
ExtensionList::$pathNames protected property A list of extension folder names keyed by extension name.
ExtensionList::$root protected property The app root.
ExtensionList::$state protected property The state store.
ExtensionList::$type protected property The type of the extension.
ExtensionList::exists public function Determines if an extension exists in the filesystem.
ExtensionList::getInfoCacheId protected function Returns the extension info cache ID.
ExtensionList::getList public function Returns all available extensions.
ExtensionList::getListCacheId protected function Returns the extension list cache ID.
ExtensionList::getPathNamesCacheId protected function Returns the extension filenames cache ID.
ExtensionList::reset public function Resets the stored extension list. 1

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