| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- <?php
- /**
- * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
- * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
- *
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice.
- *
- * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
- * @link http://cakephp.org CakePHP(tm) Project
- * @since 3.5.0
- * @license http://www.opensource.org/licenses/mit-license.php MIT License
- */
- namespace Cake\Console;
- use Cake\Core\App;
- use Cake\Core\Configure;
- use Cake\Core\Plugin;
- use Cake\Filesystem\Folder;
- use Cake\Utility\Inflector;
- /**
- * Used by CommandCollection and CommandTask to scan the filesystem
- * for command classes.
- *
- * @internal
- */
- class CommandScanner
- {
- /**
- * Scan CakePHP internals for shells & commands.
- *
- * @return array A list of command metadata.
- */
- public function scanCore()
- {
- $coreShells = $this->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;
- }
- }
|