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.
		
		
		
		
		
			
		
			
				
					
					
						
							236 lines
						
					
					
						
							5.7 KiB
						
					
					
				
			
		
		
	
	
							236 lines
						
					
					
						
							5.7 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; | 
						|
 | 
						|
/** | 
						|
 * This generator will generate a controller and one or a few action view files. | 
						|
 * | 
						|
 * @author Qiang Xue <qiang.xue@gmail.com> | 
						|
 * @since 2.0 | 
						|
 */ | 
						|
class Generator extends \yii\gii\Generator | 
						|
{ | 
						|
	/** | 
						|
	 * @var string the controller ID | 
						|
	 */ | 
						|
	public $controller; | 
						|
	/** | 
						|
	 * @var string the base class of the controller | 
						|
	 */ | 
						|
	public $baseClass = 'yii\web\Controller'; | 
						|
	/** | 
						|
	 * @var string the namespace of the controller class | 
						|
	 */ | 
						|
	public $ns; | 
						|
	/** | 
						|
	 * @var string list of action IDs separated by commas or spaces | 
						|
	 */ | 
						|
	public $actions = 'index'; | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function init() | 
						|
	{ | 
						|
		parent::init(); | 
						|
		$this->ns = \Yii::$app->controllerNamespace; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function getName() | 
						|
	{ | 
						|
		return 'Controller Generator'; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function getDescription() | 
						|
	{ | 
						|
		return 'This generator helps you to quickly generate a new controller class, | 
						|
			one or several controller actions and their corresponding views.'; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function rules() | 
						|
	{ | 
						|
		return array_merge(parent::rules(), [ | 
						|
			['controller, actions, baseClass, ns', 'filter', 'filter' => 'trim'], | 
						|
			['controller, baseClass', 'required'], | 
						|
			['controller', 'match', 'pattern' => '/^[a-z\\-\\/]*$/', 'message' => 'Only a-z, dashes (-) and slashes (/) are allowed.'], | 
						|
			['actions', 'match', 'pattern' => '/^[a-z\\-,\\s]*$/', 'message' => 'Only a-z, dashes (-), spaces and commas are allowed.'], | 
						|
			['baseClass', 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'], | 
						|
			['ns', 'match', 'pattern' => '/^[\w\\\\]*$/', 'message' => 'Only word characters and backslashes are allowed.'], | 
						|
		]); | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function attributeLabels() | 
						|
	{ | 
						|
		return [ | 
						|
			'baseClass' => 'Base Class', | 
						|
			'controller' => 'Controller ID', | 
						|
			'actions' => 'Action IDs', | 
						|
			'ns' => 'Controller Namespace', | 
						|
		]; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function requiredTemplates() | 
						|
	{ | 
						|
		return [ | 
						|
			'controller.php', | 
						|
			'view.php', | 
						|
		]; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function stickyAttributes() | 
						|
	{ | 
						|
		return ['ns', 'baseClass']; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @inheritdoc | 
						|
	 */ | 
						|
	public function hints() | 
						|
	{ | 
						|
		return [ | 
						|
			'controller' => 'Controller ID should be in lower case and may contain module ID(s) separated by slashes. For example: | 
						|
				<ul> | 
						|
					<li><code>order</code> generates <code>OrderController.php</code></li> | 
						|
					<li><code>order-item</code> generates <code>OrderItemController.php</code></li> | 
						|
					<li><code>admin/user</code> generates <code>UserController.php</code> within the <code>admin</code> module.</li> | 
						|
				</ul>', | 
						|
			'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>', | 
						|
			'ns' => 'This is the namespace that the new controller class will use.', | 
						|
			'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->controller . '/index'; | 
						|
		} else { | 
						|
			$route = $this->controller . '/' . 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 name without the namespace part. | 
						|
	 */ | 
						|
	public function getControllerClass() | 
						|
	{ | 
						|
		return Inflector::id2camel($this->getControllerID()) . 'Controller'; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @return string the controller ID (without the module ID prefix) | 
						|
	 */ | 
						|
	public function getControllerID() | 
						|
	{ | 
						|
		if (($pos = strrpos($this->controller, '/')) !== false) { | 
						|
			return substr($this->controller, $pos + 1); | 
						|
		} else { | 
						|
			return $this->controller; | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @return \yii\base\Module the module that the new controller belongs to | 
						|
	 */ | 
						|
	public function getModule() | 
						|
	{ | 
						|
		if (($pos = strrpos($this->controller, '/')) !== false) { | 
						|
			$id = substr($this->controller, 0, $pos); | 
						|
			if (($module = Yii::$app->getModule($id)) !== null) { | 
						|
				return $module; | 
						|
			} | 
						|
		} | 
						|
		return Yii::$app; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @return string the controller class file path | 
						|
	 */ | 
						|
	public function getControllerFile() | 
						|
	{ | 
						|
		$module = $this->getModule(); | 
						|
		return $module->getControllerPath() . '/' . $this->getControllerClass() . '.php'; | 
						|
	} | 
						|
 | 
						|
	/** | 
						|
	 * @param string $action the action ID | 
						|
	 * @return string the action view file path | 
						|
	 */ | 
						|
	public function getViewFile($action) | 
						|
	{ | 
						|
		$module = $this->getModule(); | 
						|
		return $module->getViewPath() . '/' . $this->getControllerID() . '/' . $action . '.php'; | 
						|
	} | 
						|
}
 | 
						|
 |