Skip to content
Snippets Groups Projects
Select Git revision
  • 8e23b465a693f75706a368cae3222dd641f65651
  • 11.x default protected
  • 10.5.x protected
  • 10.6.x protected
  • 11.2.x protected
  • 11.1.x protected
  • 10.4.x protected
  • 11.0.x protected
  • 10.3.x protected
  • 7.x protected
  • 10.2.x protected
  • 10.1.x protected
  • 9.5.x protected
  • 10.0.x protected
  • 9.4.x protected
  • 9.3.x protected
  • 9.2.x protected
  • 9.1.x protected
  • 8.9.x protected
  • 9.0.x protected
  • 8.8.x protected
  • 10.5.2 protected
  • 11.2.3 protected
  • 10.5.1 protected
  • 11.2.2 protected
  • 11.2.1 protected
  • 11.2.0 protected
  • 10.5.0 protected
  • 11.2.0-rc2 protected
  • 10.5.0-rc1 protected
  • 11.2.0-rc1 protected
  • 10.4.8 protected
  • 11.1.8 protected
  • 10.5.0-beta1 protected
  • 11.2.0-beta1 protected
  • 11.2.0-alpha1 protected
  • 10.4.7 protected
  • 11.1.7 protected
  • 10.4.6 protected
  • 11.1.6 protected
  • 10.3.14 protected
41 results

entity.api.php

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    AttributeClassDiscovery.php 4.03 KiB
    <?php
    
    namespace Drupal\Core\Plugin\Discovery;
    
    use Drupal\Component\Plugin\Attribute\AttributeInterface;
    use Drupal\Component\Plugin\Discovery\AttributeClassDiscovery as ComponentAttributeClassDiscovery;
    
    /**
     * Defines a discovery mechanism to find plugins using attributes.
     */
    class AttributeClassDiscovery extends ComponentAttributeClassDiscovery {
    
      /**
       * A suffix to append to each PSR-4 directory associated with a base namespace.
       *
       * This suffix is used to form the directories where plugins are found.
       *
       * @var string
       */
      protected $directorySuffix = '';
    
      /**
       * A suffix to append to each base namespace.
       *
       * This suffix is used to obtain the namespaces where plugins are found.
       *
       * @var string
       */
      protected $namespaceSuffix = '';
    
      /**
       * Constructs an AttributeClassDiscovery object.
       *
       * @param string $subdir
       *   Either the plugin's subdirectory, for example 'Plugin/views/filter', or
       *   empty string if plugins are located at the top level of the namespace.
       * @param \Traversable $rootNamespacesIterator
       *   An object that implements \Traversable which contains the root paths
       *   keyed by the corresponding namespace to look for plugin implementations.
       *   If $subdir is not an empty string, it will be appended to each namespace.
       * @param string $pluginDefinitionAttributeName
       *   (optional) The name of the attribute that contains the plugin definition.
       *   Defaults to 'Drupal\Component\Plugin\Attribute\Plugin'.
       */
      public function __construct(
        string $subdir,
        protected \Traversable $rootNamespacesIterator,
        string $pluginDefinitionAttributeName = 'Drupal\Component\Plugin\Attribute\Plugin',
      ) {
        if ($subdir) {
          // Prepend a directory separator to $subdir,
          // if it does not already have one.
          if ('/' !== $subdir[0]) {
            $subdir = '/' . $subdir;
          }
          $this->directorySuffix = $subdir;
          $this->namespaceSuffix = str_replace('/', '\\', $subdir);
        }
        parent::__construct([], $pluginDefinitionAttributeName);
      }
    
      /**
       * {@inheritdoc}
       */
      protected function prepareAttributeDefinition(AttributeInterface $attribute, string $class): void {
        parent::prepareAttributeDefinition($attribute, $class);
    
        if (!$attribute->getProvider()) {
          $attribute->setProvider($this->getProviderFromNamespace($class));
        }
      }
    
      /**
       * Extracts the provider name from a Drupal namespace.
       *
       * @param string $namespace
       *   The namespace to extract the provider from.
       *
       * @return string|null
       *   The matching provider name, or NULL otherwise.
       */
      protected function getProviderFromNamespace(string $namespace): ?string {
        preg_match('|^Drupal\\\\(?<provider>[\w]+)\\\\|', $namespace, $matches);
    
        if (isset($matches['provider'])) {
          return mb_strtolower($matches['provider']);
        }
    
        return NULL;
      }
    
      /**
       * {@inheritdoc}
       */
      protected function getPluginNamespaces(): array {
        $plugin_namespaces = [];
        if ($this->namespaceSuffix) {
          foreach ($this->rootNamespacesIterator as $namespace => $dirs) {
            // Append the namespace suffix to the base namespace, to obtain the
            // plugin namespace; for example, 'Drupal\views' may become
            // 'Drupal\views\Plugin\Block'.
            $namespace .= $this->namespaceSuffix;
            foreach ((array) $dirs as $dir) {
              // Append the directory suffix to the PSR-4 base directory, to obtain
              // the directory where plugins are found. For example,
              // DRUPAL_ROOT . '/core/modules/views/src' may become
              // DRUPAL_ROOT . '/core/modules/views/src/Plugin/Block'.
              $plugin_namespaces[$namespace][] = $dir . $this->directorySuffix;
            }
          }
        }
        else {
          // Both the namespace suffix and the directory suffix are empty,
          // so the plugin namespaces and directories are the same as the base
          // directories.
          foreach ($this->rootNamespacesIterator as $namespace => $dirs) {
            $plugin_namespaces[$namespace] = (array) $dirs;
          }
        }
    
        return $plugin_namespaces;
      }
    
    }