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 }
|