131 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * CWebServiceAction 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/
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * CWebServiceAction implements an action that provides Web services.
 | |
|  *
 | |
|  * CWebServiceAction serves for two purposes. On the one hand, it displays
 | |
|  * the WSDL content specifying the Web service APIs. On the other hand, it
 | |
|  * invokes the requested Web service API. A GET parameter named <code>ws</code>
 | |
|  * is used to differentiate these two aspects: the existence of the GET parameter
 | |
|  * indicates performing the latter action.
 | |
|  *
 | |
|  * By default, CWebServiceAction will use the current controller as
 | |
|  * the Web service provider. See {@link CWsdlGenerator} on how to declare
 | |
|  * methods that can be remotely invoked.
 | |
|  *
 | |
|  * Note, PHP SOAP extension is required for this action.
 | |
|  *
 | |
|  * @property CWebService $service The Web service instance.
 | |
|  *
 | |
|  * @author Qiang Xue <qiang.xue@gmail.com>
 | |
|  * @package system.web.services
 | |
|  * @since 1.0
 | |
|  */
 | |
| class CWebServiceAction extends CAction
 | |
| {
 | |
| 	/**
 | |
| 	 * @var mixed the Web service provider object or class name.
 | |
| 	 * If specified as a class name, it can be a path alias.
 | |
| 	 * Defaults to null, meaning the current controller is used as the service provider.
 | |
| 	 * If the provider implements the interface {@link IWebServiceProvider},
 | |
| 	 * it will be able to intercept the remote method invocation and perform
 | |
| 	 * additional tasks (e.g. authentication, logging).
 | |
| 	 */
 | |
| 	public $provider;
 | |
| 	/**
 | |
| 	 * @var string the URL for the Web service. Defaults to null, meaning
 | |
| 	 * the URL for this action is used to provide Web services.
 | |
| 	 * In this case, a GET parameter named {@link serviceVar} will be used to
 | |
| 	 * deteremine whether the current request is for WSDL or Web service.
 | |
| 	 */
 | |
| 	public $serviceUrl;
 | |
| 	/**
 | |
| 	 * @var string the URL for WSDL. Defaults to null, meaning
 | |
| 	 * the URL for this action is used to serve WSDL document.
 | |
| 	 */
 | |
| 	public $wsdlUrl;
 | |
| 	/**
 | |
| 	 * @var string the name of the GET parameter that differentiates a WSDL request
 | |
| 	 * from a Web service request. If this GET parameter exists, the request is considered
 | |
| 	 * as a Web service request; otherwise, it is a WSDL request.  Defaults to 'ws'.
 | |
| 	 */
 | |
| 	public $serviceVar='ws';
 | |
| 	/**
 | |
| 	 * @var array a list of PHP classes that are declared as complex types in WSDL.
 | |
| 	 * This should be an array with WSDL types as keys and names of PHP classes as values.
 | |
| 	 * A PHP class can also be specified as a path alias.
 | |
| 	 * @see http://www.php.net/manual/en/soapclient.soapclient.php
 | |
| 	 */
 | |
| 	public $classMap;
 | |
| 	/**
 | |
| 	 * @var array the initial property values for the {@link CWebService} object.
 | |
| 	 * The array keys are property names of {@link CWebService} and the array values
 | |
| 	 * are the corresponding property initial values.
 | |
| 	 */
 | |
| 	public $serviceOptions=array();
 | |
| 
 | |
| 	private $_service;
 | |
| 
 | |
| 
 | |
| 	/**
 | |
| 	 * Runs the action.
 | |
| 	 * If the GET parameter {@link serviceVar} exists, the action handle the remote method invocation.
 | |
| 	 * If not, the action will serve WSDL content;
 | |
| 	 */
 | |
| 	public function run()
 | |
| 	{
 | |
| 		$hostInfo=Yii::app()->getRequest()->getHostInfo();
 | |
| 		$controller=$this->getController();
 | |
| 		if(($serviceUrl=$this->serviceUrl)===null)
 | |
| 			$serviceUrl=$hostInfo.$controller->createUrl($this->getId(),array($this->serviceVar=>1));
 | |
| 		if(($wsdlUrl=$this->wsdlUrl)===null)
 | |
| 			$wsdlUrl=$hostInfo.$controller->createUrl($this->getId());
 | |
| 		if(($provider=$this->provider)===null)
 | |
| 			$provider=$controller;
 | |
| 
 | |
| 		$this->_service=$this->createWebService($provider,$wsdlUrl,$serviceUrl);
 | |
| 
 | |
| 		if(is_array($this->classMap))
 | |
| 			$this->_service->classMap=$this->classMap;
 | |
| 
 | |
| 		foreach($this->serviceOptions as $name=>$value)
 | |
| 			$this->_service->$name=$value;
 | |
| 
 | |
| 		if(isset($_GET[$this->serviceVar]))
 | |
| 			$this->_service->run();
 | |
| 		else
 | |
| 			$this->_service->renderWsdl();
 | |
| 
 | |
| 		Yii::app()->end();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the Web service instance currently being used.
 | |
| 	 * @return CWebService the Web service instance
 | |
| 	 */
 | |
| 	public function getService()
 | |
| 	{
 | |
| 		return $this->_service;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Creates a {@link CWebService} instance.
 | |
| 	 * You may override this method to customize the created instance.
 | |
| 	 * @param mixed $provider the web service provider class name or object
 | |
| 	 * @param string $wsdlUrl the URL for WSDL.
 | |
| 	 * @param string $serviceUrl the URL for the Web service.
 | |
| 	 * @return CWebService the Web service instance
 | |
| 	 */
 | |
| 	protected function createWebService($provider,$wsdlUrl,$serviceUrl)
 | |
| 	{
 | |
| 		return new CWebService($provider,$wsdlUrl,$serviceUrl);
 | |
| 	}
 | |
| } |