function AnnotatedClassDiscovery::getDefinitions

Same name in other branches
  1. 8.9.x core/lib/Drupal/Component/Annotation/Plugin/Discovery/AnnotatedClassDiscovery.php \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery::getDefinitions()
  2. 10 core/lib/Drupal/Component/Annotation/Plugin/Discovery/AnnotatedClassDiscovery.php \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery::getDefinitions()
  3. 11.x core/lib/Drupal/Component/Annotation/Plugin/Discovery/AnnotatedClassDiscovery.php \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery::getDefinitions()

Overrides DiscoveryTrait::getDefinitions

1 method overrides AnnotatedClassDiscovery::getDefinitions()
AnnotatedClassDiscoveryAutomatedProviders::getDefinitions in core/modules/migrate/src/Plugin/Discovery/AnnotatedClassDiscoveryAutomatedProviders.php
Gets the definition of all plugins for this type.

File

core/lib/Drupal/Component/Annotation/Plugin/Discovery/AnnotatedClassDiscovery.php, line 107

Class

AnnotatedClassDiscovery
Defines a discovery mechanism to find annotated plugins in PSR-4 namespaces.

Namespace

Drupal\Component\Annotation\Plugin\Discovery

Code

public function getDefinitions() {
    $definitions = [];
    $reader = $this->getAnnotationReader();
    // Clear the annotation loaders of any previous annotation classes.
    AnnotationRegistry::reset();
    // Register the namespaces of classes that can be used for annotations.
    AnnotationRegistry::registerLoader('class_exists');
    // Search for classes within all PSR-4 namespace locations.
    foreach ($this->getPluginNamespaces() as $namespace => $dirs) {
        foreach ($dirs as $dir) {
            if (file_exists($dir)) {
                $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS));
                foreach ($iterator as $fileinfo) {
                    if ($fileinfo->getExtension() == 'php') {
                        if ($cached = $this->fileCache
                            ->get($fileinfo->getPathName())) {
                            if (isset($cached['id'])) {
                                // Explicitly unserialize this to create a new object instance.
                                $definitions[$cached['id']] = unserialize($cached['content']);
                            }
                            continue;
                        }
                        $sub_path = $iterator->getSubIterator()
                            ->getSubPath();
                        $sub_path = $sub_path ? str_replace(DIRECTORY_SEPARATOR, '\\', $sub_path) . '\\' : '';
                        $class = $namespace . '\\' . $sub_path . $fileinfo->getBasename('.php');
                        // 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());
                        $parser = new StaticReflectionParser($class, $finder, TRUE);
                        
                        /** @var \Drupal\Component\Annotation\AnnotationInterface $annotation */
                        if ($annotation = $reader->getClassAnnotation($parser->getReflectionClass(), $this->pluginDefinitionAnnotationName)) {
                            $this->prepareAnnotationDefinition($annotation, $class);
                            $id = $annotation->getId();
                            $content = $annotation->get();
                            $definitions[$id] = $content;
                            // Explicitly serialize this to create a new object instance.
                            $this->fileCache
                                ->set($fileinfo->getPathName(), [
                                'id' => $id,
                                'content' => serialize($content),
                            ]);
                        }
                        else {
                            // Store a NULL object, so the file is not reparsed again.
                            $this->fileCache
                                ->set($fileinfo->getPathName(), [
                                NULL,
                            ]);
                        }
                    }
                }
            }
        }
    }
    // Don't let annotation loaders pile up.
    AnnotationRegistry::reset();
    return $definitions;
}

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