112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * CAction class file.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @link http://www.yiiframework.com/
 | |
|  * @copyright 2008-2013 Yii Software LLC
 | |
|  * @license http://www.yiiframework.com/license/
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * CAction is the base class for all controller action classes.
 | |
|  *
 | |
|  * CAction provides a way to divide a complex controller into
 | |
|  * smaller actions in separate class files.
 | |
|  *
 | |
|  * Derived classes must implement {@link run()} which is invoked by
 | |
|  * controller when the action is requested.
 | |
|  *
 | |
|  * An action instance can access its controller via {@link getController controller} property.
 | |
|  *
 | |
|  * @property CController $controller The controller who owns this action.
 | |
|  * @property string $id Id of this action.
 | |
|  *
 | |
|  * @method run() executes action
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @package system.web.actions
 | |
|  * @since 1.0
 | |
|  */
 | |
| abstract class CAction extends CComponent implements IAction
 | |
| {
 | |
| 	private $_id;
 | |
| 	private $_controller;
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 * @param CController $controller the controller who owns this action.
 | |
| 	 * @param string $id id of the action.
 | |
| 	 */
 | |
| 	public function __construct($controller,$id)
 | |
| 	{
 | |
| 		$this->_controller=$controller;
 | |
| 		$this->_id=$id;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return CController the controller who owns this action.
 | |
| 	 */
 | |
| 	public function getController()
 | |
| 	{
 | |
| 		return $this->_controller;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @return string id of this action
 | |
| 	 */
 | |
| 	public function getId()
 | |
| 	{
 | |
| 		return $this->_id;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Runs the action with the supplied request parameters.
 | |
| 	 * This method is internally called by {@link CController::runAction()}.
 | |
| 	 * @param array $params the request parameters (name=>value)
 | |
| 	 * @return boolean whether the request parameters are valid
 | |
| 	 * @since 1.1.7
 | |
| 	 */
 | |
| 	public function runWithParams($params)
 | |
| 	{
 | |
| 		$method=new ReflectionMethod($this, 'run');
 | |
| 		if($method->getNumberOfParameters()>0)
 | |
| 			return $this->runWithParamsInternal($this, $method, $params);
 | |
| 		else
 | |
| 			return $this->run();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Executes a method of an object with the supplied named parameters.
 | |
| 	 * This method is internally used.
 | |
| 	 * @param mixed $object the object whose method is to be executed
 | |
| 	 * @param ReflectionMethod $method the method reflection
 | |
| 	 * @param array $params the named parameters
 | |
| 	 * @return boolean whether the named parameters are valid
 | |
| 	 * @since 1.1.7
 | |
| 	 */
 | |
| 	protected function runWithParamsInternal($object, $method, $params)
 | |
| 	{
 | |
| 		$ps=array();
 | |
| 		foreach($method->getParameters() as $i=>$param)
 | |
| 		{
 | |
| 			$name=$param->getName();
 | |
| 			if(isset($params[$name]))
 | |
| 			{
 | |
| 				if($param->isArray())
 | |
| 					$ps[]=is_array($params[$name]) ? $params[$name] : array($params[$name]);
 | |
| 				elseif(!is_array($params[$name]))
 | |
| 					$ps[]=$params[$name];
 | |
| 				else
 | |
| 					return false;
 | |
| 			}
 | |
| 			elseif($param->isDefaultValueAvailable())
 | |
| 				$ps[]=$param->getDefaultValue();
 | |
| 			else
 | |
| 				return false;
 | |
| 		}
 | |
| 		$method->invokeArgs($object,$ps);
 | |
| 		return true;
 | |
| 	}
 | |
| }
 |