injectableFactory = $injectableFactory; $this->metadata = $metadata; } public function run(array $argv): void { $command = $this->getCommandNameFromArgv($argv); $params = $this->createParams($argv); $io = new IO(); $commandObj = $this->createCommand($command); if (!$commandObj instanceof Command) { // for backward compatibility $commandObj->run($params->getOptions(), $params->getFlagList(), $params->getArgumentList()); return; } $commandObj->run($params, $io); } private function getCommandNameFromArgv(array $argv): string { $command = isset($argv[1]) ? trim($argv[1]): null; if (!$command) { throw new CommandNotSpecified("Command name is not specifed."); } return ucfirst(Util::hyphenToCamelCase($command)); } private function createCommand(string $command): object { $className = $this->getClassName($command); return $this->injectableFactory->create($className); } private function getClassName(string $command): string { $className = $this->metadata->get(['app', 'consoleCommands', lcfirst($command), 'className']); if ($className) { return $className; } $className = 'Espo\\Core\\Console\\Commands\\' . $command; if (!class_exists($className)) { throw new CommandNotFound("Command '{$command}' does not exist."); } return $className; } private function createParams(array $argv): Params { $argumentList = []; $options = []; $flagList = []; $itemList = array_slice($argv, 2); foreach ($itemList as $item) { if (strpos($item, '--') === 0 && strpos($item, '=') > 2) { list($name, $value) = explode('=', substr($item, 2)); $name = Util::hyphenToCamelCase($name); $options[$name] = $value; } else if (strpos($item, '--') === 0) { $flagList[] = Util::hyphenToCamelCase(substr($item, 2)); } else if (strpos($item, '-') === 0) { $flagList[] = substr($item, 1); } else { $argumentList[] = $item; } } return new Params([ 'argumentList' => $argumentList, 'options' => $options, 'flagList' => $flagList, ]); } }