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.8 KiB
						
					
					
				
			
		
		
	
	
							236 lines
						
					
					
						
							5.8 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'; | |
| 	} | |
| }
 | |
| 
 |