MissingClassDetectionClassLoader.php

Namespace

Drupal\Component\Discovery

File

core/lib/Drupal/Component/Discovery/MissingClassDetectionClassLoader.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Component\Discovery;


/**
 * Defines a classloader that detects missing classes.
 *
 * This does not load classes. It allows calling code to explicitly check
 * whether a class that was requested failed to be discovered by other class
 * loaders.
 *
 * It also works around a PHP limitation when it attempts to load a class that
 * relies on a trait that does not exist. This is a common situation with Drupal
 * plugins, which may be intended to be dormant unless certain other modules are
 * installed.
 *
 * @see https://github.com/php/php-src/issues/17959
 * @internal
 */
final class MissingClassDetectionClassLoader {
  
  /**
   * An array of detected missing traits.
   */
  protected array $missingTraits = [];
  
  /**
   * Flag indicating whether there was an attempt to load a missing class.
   */
  protected bool $missingClass = FALSE;
  
  /**
   * Records missing classes and aliases missing traits.
   *
   * This method is registered as a class loader during attribute discovery and
   * runs last. Any call to this method means that the requested class is
   * missing. If that class is a trait, it is aliased to a stub trait to avoid
   * an uncaught PHP fatal error.
   *
   * @param string $class
   *   The class name to load.
   */
  public function loadClass(string $class) : void {
    $this->missingClass = TRUE;
    if (str_ends_with($class, 'Trait')) {
      $this->missingTraits[] = $class;
      class_alias(StubTrait::class, $class);
    }
  }
  
  /**
   * Returns whether there was an attempt to load a missing class.
   *
   * @return bool
   *   TRUE if there was an attempt to load a missing class, otherwise FALSE.
   */
  public function hasMissingClass() : bool {
    return $this->missingClass;
  }
  
  /**
   * Returns all recorded missing traits since the last reset.
   *
   * @return string[]
   *   An array of traits recorded as missing.
   */
  public function getMissingTraits() : array {
    return $this->missingTraits;
  }
  
  /**
   * Resets class variables.
   */
  public function reset() : void {
    $this->missingClass = FALSE;
    $this->missingTraits = [];
  }

}

Classes

Title Deprecated Summary
MissingClassDetectionClassLoader Defines a classloader that detects missing classes.

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