summaryrefslogtreecommitdiff
path: root/framework/web/services/CWebServiceAction.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/services/CWebServiceAction.php')
-rw-r--r--framework/web/services/CWebServiceAction.php132
1 files changed, 132 insertions, 0 deletions
diff --git a/framework/web/services/CWebServiceAction.php b/framework/web/services/CWebServiceAction.php
new file mode 100644
index 0000000..d4dfbc9
--- /dev/null
+++ b/framework/web/services/CWebServiceAction.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * CWebServiceAction class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 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>
+ * @version $Id: CWebServiceAction.php 3426 2011-10-25 00:01:09Z alexander.makarow $
+ * @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);
+ }
+} \ No newline at end of file