You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
6.9 KiB
224 lines
6.9 KiB
<?php |
|
/** |
|
* @link http://www.yiiframework.com/ |
|
* @copyright Copyright (c) 2008 Yii Software LLC |
|
* @license http://www.yiiframework.com/license/ |
|
*/ |
|
|
|
namespace yii\gii\generators\controller; |
|
|
|
use Yii; |
|
use yii\gii\CodeFile; |
|
use yii\helpers\Html; |
|
use yii\helpers\Inflector; |
|
use yii\helpers\StringHelper; |
|
|
|
/** |
|
* This generator will generate a controller and one or a few action view files. |
|
* |
|
* @property array $actionIDs An array of action IDs entered by the user. This property is read-only. |
|
* @property string $controllerFile The controller class file path. This property is read-only. |
|
* @property string $controllerID The controller ID (without the module ID prefix). This property is |
|
* read-only. |
|
* @property \yii\base\Module $module The module that the new controller belongs to. This property is |
|
* read-only. |
|
* |
|
* @author Qiang Xue <qiang.xue@gmail.com> |
|
* @since 2.0 |
|
*/ |
|
class Generator extends \yii\gii\Generator |
|
{ |
|
/** |
|
* @var string the controller class name |
|
*/ |
|
public $controllerClass; |
|
/** |
|
* @var string the controller's view path |
|
*/ |
|
public $viewPath; |
|
/** |
|
* @var string the base class of the controller |
|
*/ |
|
public $baseClass = 'yii\web\Controller'; |
|
/** |
|
* @var string list of action IDs separated by commas or spaces |
|
*/ |
|
public $actions = 'index'; |
|
|
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function getName() |
|
{ |
|
return 'Controller Generator'; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function getDescription() |
|
{ |
|
return 'This generator helps you to quickly generate a new controller class with |
|
one or several controller actions and their corresponding views.'; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function rules() |
|
{ |
|
return array_merge(parent::rules(), [ |
|
[['controllerClass', 'actions', 'baseClass'], 'filter', 'filter' => 'trim'], |
|
[['controllerClass', 'baseClass'], 'required'], |
|
['controllerClass', 'match', 'pattern' => '/^[\w\\\\]*Controller$/', 'message' => 'Only word characters and backslashes are allowed, and the class name must end with "Controller".'], |
|
['controllerClass', 'validateNewClass'], |
|
['baseClass', 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'], |
|
['actions', 'match', 'pattern' => '/^[a-z][a-z0-9\\-,\\s]*$/', 'message' => 'Only a-z, 0-9, dashes (-), spaces and commas are allowed.'], |
|
]); |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function attributeLabels() |
|
{ |
|
return [ |
|
'baseClass' => 'Base Class', |
|
'controllerClass' => 'Controller Class', |
|
'viewPath' => 'View Path', |
|
'actions' => 'Action IDs', |
|
]; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function requiredTemplates() |
|
{ |
|
return [ |
|
'controller.php', |
|
'view.php', |
|
]; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function stickyAttributes() |
|
{ |
|
return ['baseClass']; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function hints() |
|
{ |
|
return [ |
|
'controllerClass' => 'This is the name of the controller class to be generated. You should |
|
provide a fully qualified namespaced class (e.g. <code>app\controllers\PostController</code>), |
|
and class name should be in CamelCase ending with the word <code>Controller</code>. Make sure the class |
|
is using the same namespace as specified by your application\'s controllerNamespace property.', |
|
'actions' => 'Provide one or multiple action IDs to generate empty action method(s) in the controller. Separate multiple action IDs with commas or spaces. |
|
Action IDs should be in lower case. For example: |
|
<ul> |
|
<li><code>index</code> generates <code>actionIndex()</code></li> |
|
<li><code>create-order</code> generates <code>actionCreateOrder()</code></li> |
|
</ul>', |
|
'viewPath' => 'Specify the directory for storing the view scripts for the controller. You may use path alias here, e.g., |
|
<code>/var/www/basic/controllers/views/order</code>, <code>@app/views/order</code>. If not set, it will default |
|
to <code>@app/views/ControllerID</code>', |
|
'baseClass' => 'This is the class that the new controller class will extend from. Please make sure the class exists and can be autoloaded.', |
|
]; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function successMessage() |
|
{ |
|
$actions = $this->getActionIDs(); |
|
if (in_array('index', $actions)) { |
|
$route = $this->getControllerID() . '/index'; |
|
} else { |
|
$route = $this->getControllerID() . '/' . reset($actions); |
|
} |
|
$link = Html::a('try it now', Yii::$app->getUrlManager()->createUrl($route), ['target' => '_blank']); |
|
|
|
return "The controller has been generated successfully. You may $link."; |
|
} |
|
|
|
/** |
|
* @inheritdoc |
|
*/ |
|
public function generate() |
|
{ |
|
$files = []; |
|
|
|
$files[] = new CodeFile( |
|
$this->getControllerFile(), |
|
$this->render('controller.php') |
|
); |
|
|
|
foreach ($this->getActionIDs() as $action) { |
|
$files[] = new CodeFile( |
|
$this->getViewFile($action), |
|
$this->render('view.php', ['action' => $action]) |
|
); |
|
} |
|
|
|
return $files; |
|
} |
|
|
|
/** |
|
* Normalizes [[actions]] into an array of action IDs. |
|
* @return array an array of action IDs entered by the user |
|
*/ |
|
public function getActionIDs() |
|
{ |
|
$actions = array_unique(preg_split('/[\s,]+/', $this->actions, -1, PREG_SPLIT_NO_EMPTY)); |
|
sort($actions); |
|
|
|
return $actions; |
|
} |
|
|
|
/** |
|
* @return string the controller class file path |
|
*/ |
|
public function getControllerFile() |
|
{ |
|
return Yii::getAlias('@' . str_replace('\\', '/', $this->controllerClass)) . '.php'; |
|
} |
|
|
|
/** |
|
* @return string the controller ID |
|
*/ |
|
public function getControllerID() |
|
{ |
|
$name = StringHelper::basename($this->controllerClass); |
|
return Inflector::camel2id(substr($name, 0, strlen($name) - 10)); |
|
} |
|
|
|
/** |
|
* @param string $action the action ID |
|
* @return string the action view file path |
|
*/ |
|
public function getViewFile($action) |
|
{ |
|
if (empty($this->viewPath)) { |
|
return Yii::getAlias('@app/views/' . $this->getControllerID() . "/$action.php"); |
|
} else { |
|
return Yii::getAlias($this->viewPath . "/$action.php"); |
|
} |
|
} |
|
|
|
/** |
|
* @return string the namespace of the controller class |
|
*/ |
|
public function getControllerNamespace() |
|
{ |
|
$name = StringHelper::basename($this->controllerClass); |
|
return ltrim(substr($this->controllerClass, 0, strlen($name) + 1), '\\'); |
|
} |
|
}
|
|
|