123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?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);
- }
- }
|