* @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 ws
* 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
* @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);
}
}