class AnnotatedClassDiscovery in Plug 7
Same name in this branch
- 7 lib/Drupal/Core/Plugin/Discovery/AnnotatedClassDiscovery.php \Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery
- 7 lib/Drupal/Component/Annotation/Plugin/Discovery/AnnotatedClassDiscovery.php \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery
Defines a discovery mechanism to find annotated plugins in PSR-0 namespaces.
Hierarchy
- class \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery implements DiscoveryInterface uses DiscoveryTrait
Expanded class hierarchy of AnnotatedClassDiscovery
1 file declares its use of AnnotatedClassDiscovery
- AnnotatedClassDiscovery.php in lib/
Drupal/ Core/ Plugin/ Discovery/ AnnotatedClassDiscovery.php - Contains \Drupal\Core\Plugin\Discovery\AnnotatedClassDiscovery.
File
- lib/
Drupal/ Component/ Annotation/ Plugin/ Discovery/ AnnotatedClassDiscovery.php, line 21 - Contains \Drupal\Component\Annotation\Plugin\Discovery\AnnotatedClassDiscovery.
Namespace
Drupal\Component\Annotation\Plugin\DiscoveryView source
class AnnotatedClassDiscovery implements DiscoveryInterface {
use DiscoveryTrait;
/**
* The namespaces within which to find plugin classes.
*
* @var string[]
*/
protected $pluginNamespaces;
/**
* The name of the annotation that contains the plugin definition.
*
* The class corresponding to this name must implement
* \Drupal\Component\Annotation\AnnotationInterface.
*
* @var string
*/
protected $pluginDefinitionAnnotationName;
/**
* The doctrine annotation reader.
*
* @var \Doctrine\Common\Annotations\Reader
*/
protected $annotationReader;
/**
* Constructs a new instance.
*
* @param string[] $plugin_namespaces
* (optional) An array of namespace that may contain plugin implementations.
* Defaults to an empty array.
* @param string $plugin_definition_annotation_name
* (optional) The name of the annotation that contains the plugin definition.
* Defaults to 'Drupal\Component\Annotation\Plugin'.
*/
function __construct($plugin_namespaces = array(), $plugin_definition_annotation_name = 'Drupal\\Component\\Annotation\\Plugin') {
$this->pluginNamespaces = $plugin_namespaces;
$this->pluginDefinitionAnnotationName = $plugin_definition_annotation_name;
}
/**
* Gets the used doctrine annotation reader.
*
* @return \Doctrine\Common\Annotations\Reader
* The annotation reader.
*/
protected function getAnnotationReader() {
if (!isset($this->annotationReader)) {
$this->annotationReader = new SimpleAnnotationReader();
// Add the namespaces from the main plugin annotation, like @EntityType.
$namespace = substr($this->pluginDefinitionAnnotationName, 0, strrpos($this->pluginDefinitionAnnotationName, '\\'));
$this->annotationReader
->addNamespace($namespace);
}
return $this->annotationReader;
}
/**
* {@inheritdoc}
*/
public function getDefinitions() {
$definitions = array();
$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-0 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') {
$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 $annotation \Drupal\Component\Annotation\AnnotationInterface */
if ($annotation = $reader
->getClassAnnotation($parser
->getReflectionClass(), $this->pluginDefinitionAnnotationName)) {
$this
->prepareAnnotationDefinition($annotation, $class);
$definitions[$annotation
->getId()] = $annotation
->get();
}
}
}
}
}
}
// Don't let annotation loaders pile up.
AnnotationRegistry::reset();
return $definitions;
}
/**
* Prepares the annotation definition.
*
* @param \Drupal\Component\Annotation\AnnotationInterface $annotation
* The annotation derived from the plugin.
* @param string $class
* The class used for the plugin.
*/
protected function prepareAnnotationDefinition(AnnotationInterface $annotation, $class) {
$annotation
->setClass($class);
}
/**
* Gets an array of PSR-0 namespaces to search for plugin classes.
*
* @return string[]
*/
protected function getPluginNamespaces() {
return $this->pluginNamespaces;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AnnotatedClassDiscovery:: |
protected | property | The doctrine annotation reader. | |
AnnotatedClassDiscovery:: |
protected | property | The name of the annotation that contains the plugin definition. | |
AnnotatedClassDiscovery:: |
protected | property | The namespaces within which to find plugin classes. | |
AnnotatedClassDiscovery:: |
protected | function | Gets the used doctrine annotation reader. | 1 |
AnnotatedClassDiscovery:: |
public | function |
Gets the definition of all plugins for this type. Overrides DiscoveryTrait:: |
|
AnnotatedClassDiscovery:: |
protected | function | Gets an array of PSR-0 namespaces to search for plugin classes. | 1 |
AnnotatedClassDiscovery:: |
protected | function | Prepares the annotation definition. | 1 |
AnnotatedClassDiscovery:: |
function | Constructs a new instance. | 1 | |
DiscoveryTrait:: |
protected | function | Gets a specific plugin definition. | |
DiscoveryTrait:: |
public | function | 3 | |
DiscoveryTrait:: |
public | function |