scanDir( dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Shell' . DIRECTORY_SEPARATOR, 'Cake\Shell\\', '', ['command_list'] ); $coreCommands = $this->scanDir( dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Command' . DIRECTORY_SEPARATOR, 'Cake\Command\\', '', ['command_list'] ); return array_merge($coreShells, $coreCommands); } /** * Scan the application for shells & commands. * * @return array A list of command metadata. */ public function scanApp() { $appNamespace = Configure::read('App.namespace'); $appShells = $this->scanDir( App::path('Shell')[0], $appNamespace . '\Shell\\', '', [] ); $appCommands = $this->scanDir( App::path('Command')[0], $appNamespace . '\Command\\', '', [] ); return array_merge($appShells, $appCommands); } /** * Scan the named plugin for shells and commands * * @param string $plugin The named plugin. * @return array A list of command metadata. */ public function scanPlugin($plugin) { if (!Plugin::loaded($plugin)) { return []; } $path = Plugin::classPath($plugin); $namespace = str_replace('/', '\\', $plugin); $prefix = Inflector::underscore($plugin) . '.'; $commands = $this->scanDir($path . 'Command', $namespace . '\Command\\', $prefix, []); $shells = $this->scanDir($path . 'Shell', $namespace . '\Shell\\', $prefix, []); return array_merge($shells, $commands); } /** * Scan a directory for .php files and return the class names that * should be within them. * * @param string $path The directory to read. * @param string $namespace The namespace the shells live in. * @param string $prefix The prefix to apply to commands for their full name. * @param array $hide A list of command names to hide as they are internal commands. * @return array The list of shell info arrays based on scanning the filesystem and inflection. */ protected function scanDir($path, $namespace, $prefix, array $hide) { $dir = new Folder($path); $contents = $dir->read(true, true); if (empty($contents[1])) { return []; } $classPattern = '/(Shell|Command)$/'; $shells = []; foreach ($contents[1] as $file) { if (substr($file, -4) !== '.php') { continue; } $shell = substr($file, 0, -4); if (!preg_match($classPattern, $shell)) { continue; } $name = Inflector::underscore(preg_replace($classPattern, '', $shell)); if (in_array($name, $hide, true)) { continue; } $class = $namespace . $shell; if (!is_subclass_of($class, Shell::class) && !is_subclass_of($class, Command::class)) { continue; } $shells[] = [ 'file' => $path . $file, 'fullName' => $prefix . $name, 'name' => $name, 'class' => $class ]; } return $shells; } }