|
|
<?php |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace think\console; |
|
|
|
|
|
use Exception; |
|
|
use think\console\output\Ask; |
|
|
use think\console\output\Descriptor; |
|
|
use think\console\output\driver\Buffer; |
|
|
use think\console\output\driver\Console; |
|
|
use think\console\output\driver\Nothing; |
|
|
use think\console\output\Question; |
|
|
use think\console\output\question\Choice; |
|
|
use think\console\output\question\Confirmation; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Output |
|
|
{ |
|
|
const VERBOSITY_QUIET = 0; |
|
|
const VERBOSITY_NORMAL = 1; |
|
|
const VERBOSITY_VERBOSE = 2; |
|
|
const VERBOSITY_VERY_VERBOSE = 3; |
|
|
const VERBOSITY_DEBUG = 4; |
|
|
|
|
|
const OUTPUT_NORMAL = 0; |
|
|
const OUTPUT_RAW = 1; |
|
|
const OUTPUT_PLAIN = 2; |
|
|
|
|
|
private $verbosity = self::VERBOSITY_NORMAL; |
|
|
|
|
|
|
|
|
private $handle = null; |
|
|
|
|
|
protected $styles = [ |
|
|
'info', |
|
|
'error', |
|
|
'comment', |
|
|
'question', |
|
|
'highlight', |
|
|
'warning' |
|
|
]; |
|
|
|
|
|
public function __construct($driver = 'console') |
|
|
{ |
|
|
$class = '\\think\\console\\output\\driver\\' . ucwords($driver); |
|
|
|
|
|
$this->handle = new $class($this); |
|
|
} |
|
|
|
|
|
public function ask(Input $input, $question, $default = null, $validator = null) |
|
|
{ |
|
|
$question = new Question($question, $default); |
|
|
$question->setValidator($validator); |
|
|
|
|
|
return $this->askQuestion($input, $question); |
|
|
} |
|
|
|
|
|
public function askHidden(Input $input, $question, $validator = null) |
|
|
{ |
|
|
$question = new Question($question); |
|
|
|
|
|
$question->setHidden(true); |
|
|
$question->setValidator($validator); |
|
|
|
|
|
return $this->askQuestion($input, $question); |
|
|
} |
|
|
|
|
|
public function confirm(Input $input, $question, $default = true) |
|
|
{ |
|
|
return $this->askQuestion($input, new Confirmation($question, $default)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function choice(Input $input, $question, array $choices, $default = null) |
|
|
{ |
|
|
if (null !== $default) { |
|
|
$values = array_flip($choices); |
|
|
$default = $values[$default]; |
|
|
} |
|
|
|
|
|
return $this->askQuestion($input, new Choice($question, $choices, $default)); |
|
|
} |
|
|
|
|
|
protected function askQuestion(Input $input, Question $question) |
|
|
{ |
|
|
$ask = new Ask($input, $this, $question); |
|
|
$answer = $ask->run(); |
|
|
|
|
|
if ($input->isInteractive()) { |
|
|
$this->newLine(); |
|
|
} |
|
|
|
|
|
return $answer; |
|
|
} |
|
|
|
|
|
protected function block($style, $message) |
|
|
{ |
|
|
$this->writeln("<{$style}>{$message}</$style>"); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function newLine($count = 1) |
|
|
{ |
|
|
$this->write(str_repeat(PHP_EOL, $count)); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function writeln($messages, $type = self::OUTPUT_NORMAL) |
|
|
{ |
|
|
$this->write($messages, true, $type); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) |
|
|
{ |
|
|
$this->handle->write($messages, $newline, $type); |
|
|
} |
|
|
|
|
|
public function renderException(\Exception $e) |
|
|
{ |
|
|
$this->handle->renderException($e); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setVerbosity($level) |
|
|
{ |
|
|
$this->verbosity = (int) $level; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getVerbosity() |
|
|
{ |
|
|
return $this->verbosity; |
|
|
} |
|
|
|
|
|
public function isQuiet() |
|
|
{ |
|
|
return self::VERBOSITY_QUIET === $this->verbosity; |
|
|
} |
|
|
|
|
|
public function isVerbose() |
|
|
{ |
|
|
return self::VERBOSITY_VERBOSE <= $this->verbosity; |
|
|
} |
|
|
|
|
|
public function isVeryVerbose() |
|
|
{ |
|
|
return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; |
|
|
} |
|
|
|
|
|
public function isDebug() |
|
|
{ |
|
|
return self::VERBOSITY_DEBUG <= $this->verbosity; |
|
|
} |
|
|
|
|
|
public function describe($object, array $options = []) |
|
|
{ |
|
|
$descriptor = new Descriptor(); |
|
|
$options = array_merge([ |
|
|
'raw_text' => false, |
|
|
], $options); |
|
|
|
|
|
$descriptor->describe($this, $object, $options); |
|
|
} |
|
|
|
|
|
public function __call($method, $args) |
|
|
{ |
|
|
if (in_array($method, $this->styles)) { |
|
|
array_unshift($args, $method); |
|
|
return call_user_func_array([$this, 'block'], $args); |
|
|
} |
|
|
|
|
|
if ($this->handle && method_exists($this->handle, $method)) { |
|
|
return call_user_func_array([$this->handle, $method], $args); |
|
|
} else { |
|
|
throw new Exception('method not exists:' . __CLASS__ . '->' . $method); |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|