annotate vendor/chi-teck/drupal-code-generator/src/GeneratorDiscovery.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents c75dbcec494b
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace DrupalCodeGenerator;
Chris@0 4
Chris@0 5 use RecursiveDirectoryIterator;
Chris@0 6 use RecursiveIteratorIterator;
Chris@0 7 use ReflectionClass;
Chris@0 8 use Symfony\Component\Filesystem\Filesystem;
Chris@0 9
Chris@0 10 /**
Chris@0 11 * Discovery of generator commands.
Chris@0 12 */
Chris@0 13 class GeneratorDiscovery {
Chris@0 14
Chris@0 15 const COMMAND_INTERFACE = '\DrupalCodeGenerator\Command\GeneratorInterface';
Chris@0 16
Chris@0 17 /**
Chris@0 18 * The file system utility.
Chris@0 19 *
Chris@0 20 * @var \Symfony\Component\Filesystem\Filesystem
Chris@0 21 */
Chris@0 22 protected $filesystem;
Chris@0 23
Chris@0 24 /**
Chris@0 25 * Constructs discovery object.
Chris@0 26 *
Chris@0 27 * @param \Symfony\Component\Filesystem\Filesystem $filesystem
Chris@0 28 * The file system utility.
Chris@0 29 */
Chris@0 30 public function __construct(Filesystem $filesystem) {
Chris@0 31 $this->filesystem = $filesystem;
Chris@0 32 }
Chris@0 33
Chris@0 34 /**
Chris@0 35 * Finds and instantiates generator commands.
Chris@0 36 *
Chris@0 37 * @param array $command_directories
Chris@0 38 * Directories to look up for commands.
Chris@0 39 * @param string $namespace
Chris@0 40 * (Optional) The namespace to filter out commands.
Chris@0 41 *
Chris@0 42 * @return \Symfony\Component\Console\Command\Command[]
Chris@0 43 * Array of generators.
Chris@0 44 */
Chris@0 45 public function getGenerators(array $command_directories, $namespace = '\DrupalCodeGenerator\Command') {
Chris@0 46 $commands = [];
Chris@0 47
Chris@0 48 foreach ($command_directories as $directory) {
Chris@0 49 $iterator = new RecursiveIteratorIterator(
Chris@0 50 new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS)
Chris@0 51 );
Chris@0 52 foreach ($iterator as $path => $file) {
Chris@0 53 if ($file->getExtension() == 'php') {
Chris@0 54 $relative_path = $this->filesystem->makePathRelative($path, $directory);
Chris@0 55 $class = $namespace . '\\' . str_replace('/', '\\', preg_replace('#\.php/$#', '', $relative_path));
Chris@0 56 if (class_exists($class)) {
Chris@0 57 $reflected_class = new ReflectionClass($class);
Chris@0 58 if (!$reflected_class->isInterface() && !$reflected_class->isAbstract() && $reflected_class->implementsInterface(self::COMMAND_INTERFACE)) {
Chris@0 59 $commands[] = new $class();
Chris@0 60 }
Chris@0 61 }
Chris@0 62 }
Chris@0 63 }
Chris@0 64 }
Chris@0 65
Chris@0 66 return $commands;
Chris@0 67 }
Chris@0 68
Chris@0 69 }