/** * Searches the given module for any commands that could be automatically registered. * * @param AbstractModule $module */ protected function readModuleCommands(AbstractModule $module) { $name = $module->getName(); $commandsDir = $module->getModuleDir() . '/Commands'; if (!is_dir($commandsDir)) { return; } $moduleNamespace = $module->getNamespace() . NS . 'Commands' . NS; $console = $this; // register a closure so we can recursively scan the routes directory $scan = function ($dir, $namespace, $self) use($name, $moduleNamespace, $module, $console) { $namespace = $namespace ? trim($namespace, NS) . NS : ''; $files = scandir($dir); foreach ($files as $file) { // ignore . and .. if (in_array($file, array('.', '..'))) { continue; } // if directory then go recursively if (is_dir($dir . DS . $file)) { $self($dir . DS . $file, $namespace . $file, $self); continue; } $file = explode('.', $file); $rawClass = $file[0]; $class = $moduleNamespace . $namespace . $rawClass; // class_exists autoloads a file if (class_exists($class)) { $name = $class::getName(); $name = trim($name); if (empty($name)) { throw new InvalidCommandException('Command "' . $class . '" has to have a name. Please set the static property $name.'); } $name = ($module->getCommandNamespace() ? $module->getCommandNamespace() . ':' : '') . $name; $console->addCommand($name, $class); } } }; // scan the module $scan($commandsDir, '', $scan); }