class AttributeDiscoveryWithAnnotationsAutomatedProviders

Enables both attribute and annotation discovery for plugin definitions.

@internal This is a temporary solution to the fact that migration source plugins have more than one provider. This functionality will be moved to core in https://www.drupal.org/node/2786355.

Hierarchy

Expanded class hierarchy of AttributeDiscoveryWithAnnotationsAutomatedProviders

1 file declares its use of AttributeDiscoveryWithAnnotationsAutomatedProviders
MigrateSourcePluginManager.php in core/modules/migrate/src/Plugin/MigrateSourcePluginManager.php

File

core/modules/migrate/src/Plugin/Discovery/AttributeDiscoveryWithAnnotationsAutomatedProviders.php, line 21

Namespace

Drupal\migrate\Plugin\Discovery
View source
class AttributeDiscoveryWithAnnotationsAutomatedProviders extends AttributeDiscoveryWithAnnotations {
  use AnnotatedDiscoveryAutomatedProvidersTrait;
  
  /**
   * Instance of attribute class discovery with automatic providers.
   *
   * Since there isn't multiple inheritance, instantiate the attribute only
   * discovery for code reuse.
   *
   * @var \Drupal\migrate\Plugin\Discovery\AttributeClassDiscoveryAutomatedProviders
   */
  private AttributeClassDiscoveryAutomatedProviders $attributeDiscovery;
  public function __construct(string $subdir, \Traversable $rootNamespaces, string $pluginDefinitionAttributeName = 'Drupal\\Component\\Plugin\\Attribute\\Plugin', string $pluginDefinitionAnnotationName = 'Drupal\\Component\\Annotation\\Plugin', array $additionalNamespaces = []) {
    parent::__construct($subdir, $rootNamespaces, $pluginDefinitionAttributeName, $pluginDefinitionAnnotationName, $additionalNamespaces);
    $this->finder = new ClassFinder();
    $this->attributeDiscovery = new AttributeClassDiscoveryAutomatedProviders($subdir, $rootNamespaces, $pluginDefinitionAttributeName);
  }
  
  /**
   * {@inheritdoc}
   */
  protected function prepareAttributeDefinition(AttributeInterface $attribute, string $class) : void {
    $this->attributeDiscovery
      ->prepareAttributeDefinition($attribute, $class);
  }
  
  /**
   * {@inheritdoc}
   */
  protected function parseClass(string $class, \SplFileInfo $fileinfo) : array {
    // Parse using attributes first.
    $definition = $this->attributeDiscovery
      ->parseClass($class, $fileinfo);
    if (isset($definition['id'])) {
      return $definition;
    }
    // The filename is already known, so there is no need to find the
    // file. However, StaticReflectionParser needs a finder, so use a
    // mock version.
    $finder = MockFileFinder::create($fileinfo->getPathName());
    // The parser is instantiated here with FALSE as the last parameter. This is
    // needed so that the parser includes the 'extends' declaration and extracts
    // providers from ancestor classes.
    $parser = new BaseStaticReflectionParser($class, $finder, FALSE);
    $reflection_class = $parser->getReflectionClass();
    // @todo Handle deprecating definitions discovery via annotations in
    // https://www.drupal.org/project/drupal/issues/3522409.
    /** @var \Drupal\Component\Annotation\AnnotationInterface $annotation */
    if ($annotation = $this->getAnnotationReader()
      ->getClassAnnotation($reflection_class, $this->pluginDefinitionAnnotationName)) {
      $this->prepareAnnotationDefinition($annotation, $class, $parser);
      return [
        'id' => $annotation->getId(),
        'content' => $annotation->get(),
      ];
    }
    return [
      'id' => NULL,
      'content' => NULL,
    ];
  }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
AnnotatedDiscoveryAutomatedProvidersTrait::$finder protected property A utility object that can use active autoloaders to find files for classes.
AnnotatedDiscoveryAutomatedProvidersTrait::prepareAnnotationDefinition protected function Prepares the annotation definition.
AttributeClassDiscovery::$directorySuffix protected property Suffix to append to each PSR-4 directory associated with a base namespace.
AttributeClassDiscovery::$fileCache protected property The file cache object.
AttributeClassDiscovery::$namespaceSuffix protected property A suffix to append to each base namespace.
AttributeClassDiscovery::$skipClasses protected static property An array of classes to skip.
AttributeClassDiscovery::getPluginNamespaces protected function Gets an array of PSR-4 namespaces to search for plugin classes. Overrides AttributeClassDiscovery::getPluginNamespaces
AttributeClassDiscovery::getProviderFromNamespace protected function Extracts the provider name from a Drupal namespace.
AttributeDiscoveryWithAnnotations::$annotationReader protected property The doctrine annotation reader.
AttributeDiscoveryWithAnnotations::getAnnotationReader protected function Gets the used doctrine annotation reader.
AttributeDiscoveryWithAnnotations::getDefinitions public function Gets the definition of all plugins for this type. Overrides AttributeClassDiscovery::getDefinitions
AttributeDiscoveryWithAnnotations::getFileCacheSuffix protected function Gets the file cache suffix. Overrides AttributeClassDiscovery::getFileCacheSuffix
AttributeDiscoveryWithAnnotationsAutomatedProviders::$attributeDiscovery private property Instance of attribute class discovery with automatic providers.
AttributeDiscoveryWithAnnotationsAutomatedProviders::parseClass protected function Parses attributes from a class. Overrides AttributeDiscoveryWithAnnotations::parseClass
AttributeDiscoveryWithAnnotationsAutomatedProviders::prepareAttributeDefinition protected function Prepares the attribute definition. Overrides AttributeClassDiscovery::prepareAttributeDefinition
AttributeDiscoveryWithAnnotationsAutomatedProviders::__construct public function Constructs an AttributeDiscoveryWithAnnotations object. Overrides AttributeDiscoveryWithAnnotations::__construct
DiscoveryTrait::doGetDefinition protected function Gets a specific plugin definition.
DiscoveryTrait::getDefinition public function 3
DiscoveryTrait::hasDefinition public function

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