<?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\gii\console; use Yii; use yii\base\InlineAction; use yii\console\Controller; /** * This is the command line version of Gii - a code generator. * * You can use this command to generate models, controllers, etc. For example, * to generate an ActiveRecord model based on a DB table, you can run: * * ``` * $ ./yii gii/model --tableName=city --modelClass=City * ``` * * @author Tobias Munk <schmunk@usrbin.de> * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */ class GenerateController extends Controller { /** * @var \yii\gii\Module */ public $module; /** * @var boolean whether to overwrite all existing code files when in non-interactive mode. * Defaults to false, meaning none of the existing code files will be overwritten. * This option is used only when `--interactive=0`. */ public $overwrite = false; /** * @var array a list of the available code generators */ public $generators = []; /** * @var array generator option values */ private $_options = []; /** * @inheritdoc */ public function __get($name) { return isset($this->_options[$name]) ? $this->_options[$name] : null; } /** * @inheritdoc */ public function __set($name, $value) { $this->_options[$name] = $value; } /** * @inheritdoc */ public function init() { parent::init(); foreach ($this->generators as $id => $config) { $this->generators[$id] = Yii::createObject($config); } } /** * @inheritdoc */ public function createAction($id) { /** @var $action GenerateAction */ $action = parent::createAction($id); foreach ($this->_options as $name => $value) { $action->generator->$name = $value; } return $action; } /** * @inheritdoc */ public function actions() { $actions = []; foreach ($this->generators as $name => $generator) { $actions[$name] = [ 'class' => 'yii\gii\console\GenerateAction', 'generator' => $generator, ]; } return $actions; } public function actionIndex() { $this->run('/help', ['gii']); } /** * @inheritdoc */ public function getUniqueID() { return $this->id; } /** * @inheritdoc */ public function options($id) { $options = parent::options($id); $options[] = 'overwrite'; if (!isset($this->generators[$id])) { return $options; } $attributes = $this->generators[$id]->attributes; unset($attributes['templates']); return array_merge( $options, array_keys($attributes) ); } /** * @inheritdoc */ public function getActionHelpSummary($action) { if ($action instanceof InlineAction) { return parent::getActionHelpSummary($action); } else { /** @var $action GenerateAction */ return $action->generator->getName(); } } /** * @inheritdoc */ public function getActionHelp($action) { if ($action instanceof InlineAction) { return parent::getActionHelp($action); } else { /** @var $action GenerateAction */ $description = $action->generator->getDescription(); return wordwrap(preg_replace('/\s+/', ' ', $description)); } } /** * @inheritdoc */ public function getActionArgsHelp($action) { return []; } /** * @inheritdoc */ public function getActionOptionsHelp($action) { if ($action instanceof InlineAction) { return parent::getActionOptionsHelp($action); } /** @var $action GenerateAction */ $attributes = $action->generator->attributes; unset($attributes['templates']); $hints = $action->generator->hints(); $options = parent::getActionOptionsHelp($action); foreach ($attributes as $name => $value) { $type = gettype($value); $options[$name] = [ 'type' => $type === 'NULL' ? 'string' : $type, 'required' => $value === null && $action->generator->isAttributeRequired($name), 'default' => $value, 'comment' => isset($hints[$name]) ? $this->formatHint($hints[$name]) : '', ]; } return $options; } protected function formatHint($hint) { $hint = preg_replace('%<code>(.*?)</code>%', '\1', $hint); $hint = preg_replace('/\s+/', ' ', $hint); return wordwrap($hint); } }