包 | system.web.services |
---|---|
继承 | class CWebService » CComponent |
源自 | 1.0 |
版本 | $Id: CWebService.php 3515 2011-12-28 12:29:24Z mDOMba $ |
源码 |
CWebService封装了SOAP服务和提供基于WSDL的WebService。
本类需要PHP的SOAP扩展方可正常运行。
CWebService利用CWsdlGenerator便可自动联机生成WSDL, 免去自己写WSDL的复杂麻烦。
生成WSDL是基于服务提供类中的注释块, 调用generateWsdl或者renderWsdl。处理web service 请求,调用run。
本类需要PHP的SOAP扩展方可正常运行。
CWebService利用CWsdlGenerator便可自动联机生成WSDL, 免去自己写WSDL的复杂麻烦。
生成WSDL是基于服务提供类中的注释块, 调用generateWsdl或者renderWsdl。处理web service 请求,调用run。
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
actor | string | 指定SOAP service的actor。默认为null,即不指定。 | CWebService |
cacheID | string | 用于在缓存组件中缓存已经生成的WSDL的ID。 默认值为’cache‘,提交到主缓存组件。 如果不使用缓存,请设置为False。 | CWebService |
classMap | array | 在WSDL中被声明为复杂类型的类的列表。 这应该是一个以WSDL中声明的类型为Key,对应的PHP类名为值的数组。 类名可以使用别名来表示。 | CWebService |
encoding | string | Web service的编码类型。默认为‘UTF-8’。 | CWebService |
methodName | string | 当前请求的方法名称。值为空则表示没有方法被请求。 | CWebService |
persistence | integer | SOAP server的持久模式。 | CWebService |
provider | string|object | 提供web service的类或者对象。 当值为名称时,此处可以使用别名来表示。 | CWebService |
serviceUrl | string | Web service的URL。在调用generateWsdl()和renderWsdl()时必须提供此属性。 | CWebService |
soapVersion | string | 指定SOAP版本(例如:‘1. | CWebService |
wsdlCacheDuration | integer | 生成的WSDL在缓存中保存的秒数,默认为0,即不缓存。 | CWebService |
wsdlUrl | string | WSDL的URL。在调用run()时必须提供此属性。 | CWebService |
受保护属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
options | array | 创建SoapServer实例的相关配置项。 | CWebService |
公共方法
方法 | 描述 | 定义在 |
---|---|---|
__call() | 如果类中没有调的方法名,则调用这个方法。 | CComponent |
__construct() | 构造方法。 | CWebService |
__get() | 返回一个属性值、一个事件处理程序列表或一个行为名称。 | CComponent |
__isset() | 检查一个属性是否为null。 | CComponent |
__set() | 设置一个组件的属性值。 | CComponent |
__unset() | 设置一个组件的属性为null。 | CComponent |
asa() | 返回这个名字的行为对象。 | CComponent |
attachBehavior() | 附加一个行为到组件。 | CComponent |
attachBehaviors() | 附加一个行为列表到组件。 | CComponent |
attachEventHandler() | 为事件附加一个事件处理程序。 | CComponent |
canGetProperty() | 确定属性是否可读。 | CComponent |
canSetProperty() | 确定属性是否可写。 | CComponent |
detachBehavior() | 从组件中分离一个行为。 | CComponent |
detachBehaviors() | 从组件中分离所有行为。 | CComponent |
detachEventHandler() | 分离一个存在的事件处理程序。 | CComponent |
disableBehavior() | 禁用一个附加行为。 | CComponent |
disableBehaviors() | 禁用组件附加的所有行为。 | CComponent |
enableBehavior() | 启用一个附加行为。 | CComponent |
enableBehaviors() | 启用组件附加的所有行为。 | CComponent |
evaLuateExpression() | 计算一个PHP表达式,或根据组件上下文执行回调。 | CComponent |
generateWsdl() | 根据提供web service的类或者对象的定义生成WSDL。 | CWebService |
getEventHandlers() | 返回一个事件的附加处理程序列表。 | CComponent |
getMethodName() | 返回当前请求的方法名称。值为空则表示没有方法被请求。 | CWebService |
handleError() | PHP错误处理器。 | CWebService |
hasEvent() | 确定一个事件是否定义。 | CComponent |
hasEventHandler() | 检查事件是否有附加的处理程序。 | CComponent |
hasProperty() | 确定属性是否被定义。 | CComponent |
raiseEvent() | 发起一个事件。 | CComponent |
renderWsdl() | 根据提供web service的类或者对象的定义生成和显示WSDL。 | CWebService |
run() | 处理web service请求。 | CWebService |
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
getOptions() | 返回创建SoapServer实例的相关配置项。 | CWebService |
属性详细
actor
属性
public string $actor;
指定SOAP service的actor。默认为null,即不指定。
cacheID
属性
public string $cacheID;
用于在缓存组件中缓存已经生成的WSDL的ID。 默认值为’cache‘,提交到主缓存组件。 如果不使用缓存,请设置为False。
classMap
属性
public array $classMap;
在WSDL中被声明为复杂类型的类的列表。 这应该是一个以WSDL中声明的类型为Key,对应的PHP类名为值的数组。 类名可以使用别名来表示。
参见
- http://www.php.net/manual/en/function.soap-soapserver-construct.php
encoding
属性
public string $encoding;
Web service的编码类型。默认为‘UTF-8’。
methodName
属性
只读
public string getMethodName()
当前请求的方法名称。值为空则表示没有方法被请求。
options
属性
只读
protected array getOptions()
创建SoapServer实例的相关配置项。
参见
- http://www.php.net/manual/en/function.soap-soapserver-construct.php
persistence
属性
public integer $persistence;
SOAP server的持久模式。
参见
- http://www.php.net/manual/en/function.soap-soapserver-setpersistence.php
provider
属性
public string|object $provider;
提供web service的类或者对象。 当值为名称时,此处可以使用别名来表示。
serviceUrl
属性
public string $serviceUrl;
Web service的URL。在调用generateWsdl()和renderWsdl()时必须提供此属性。
soapVersion
属性
public string $soapVersion;
指定SOAP版本(例如:‘1.1’或‘1.2’)。默认为null,即不指定。
wsdlCacheDuration
属性
public integer $wsdlCacheDuration;
生成的WSDL在缓存中保存的秒数,默认为0,即不缓存。
wsdlUrl
属性
public string $wsdlUrl;
WSDL的URL。在调用run()时必须提供此属性。
方法详细
__construct()
方法
public void __construct(mixed $provider, string $wsdlUrl, string $serviceUrl)
| ||
$provider | mixed | 提供web service的类或者对象。 |
$wsdlUrl | string | WSDL的URL。调用run()方法时必须提供此项。 |
$serviceUrl | string | Web service的URL。调用generateWsdl()和renderWsdl()方法时必须提供此项。 |
public function __construct($provider,$wsdlUrl,$serviceUrl)
{
$this->provider=$provider;
$this->wsdlUrl=$wsdlUrl;
$this->serviceUrl=$serviceUrl;
}
构造方法。
generateWsdl()
方法
public string generateWsdl()
| ||
{return} | string | 生成的WSDL |
public function generateWsdl()
{
$providerClass=is_object($this->provider) ? get_class($this->provider) : Yii::import($this->provider,true);
if($this->wsdlCacheDuration>0 && $this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null)
{
$key='Yii.CWebService.'.$providerClass.$this->serviceUrl.$this->encoding;
if(($wsdl=$cache->get($key))!==false)
return $wsdl;
}
$generator=new CWsdlGenerator;
$wsdl=$generator->generateWsdl($providerClass,$this->serviceUrl,$this->encoding);
if(isset($key))
$cache->set($key,$wsdl,$this->wsdlCacheDuration);
return $wsdl;
}
根据提供web service的类或者对象的定义生成WSDL。 若设置了缓存且缓存存在,那么会直接使用缓存中的内容。
参见
- wsdlCacheDuration
getMethodName()
方法
public string getMethodName()
| ||
{return} | string | 当前请求的方法名称。值为空则表示没有方法被请求。 |
public function getMethodName()
{
if($this->_method===null)
{
if(isset($HTTP_RAW_POST_DATA))
$request=$HTTP_RAW_POST_DATA;
else
$request=file_get_contents('php://input');
if(preg_match('/<.*?:Body[^>]*>\s*<.*?:(\w+)/mi',$request,$matches))
$this->_method=$matches[1];
else
$this->_method='';
}
return $this->_method;
}
getOptions()
方法
protected array getOptions()
| ||
{return} | array | 创建SoapServer实例的相关配置项。 |
protected function getOptions()
{
$options=array();
if($this->soapVersion==='1.1')
$options['soap_version']=SOAP_1_1;
else if($this->soapVersion==='1.2')
$options['soap_version']=SOAP_1_2;
if($this->actor!==null)
$options['actor']=$this->actor;
$options['encoding']=$this->encoding;
foreach($this->classMap as $type=>$className)
{
$className=Yii::import($className,true);
if(is_int($type))
$type=$className;
$options['classmap'][$type]=$className;
}
return $options;
}
参见
- http://www.php.net/manual/en/function.soap-soapserver-construct.php
handleError()
方法
public void handleError(CErrorEvent $event)
| ||
$event | CErrorEvent | PHP错误事件 |
public function handleError($event)
{
$event->handled=true;
$message=$event->message;
if(YII_DEBUG)
{
$trace=debug_backtrace();
if(isset($trace[2]) && isset($trace[2]['file']) && isset($trace[2]['line']))
$message.=' ('.$trace[2]['file'].':'.$trace[2]['line'].')';
}
throw new CException($message,self::SOAP_ERROR);
}
PHP错误处理器。
renderWsdl()
方法
public void renderWsdl()
|
public function renderWsdl()
{
$wsdl=$this->generateWsdl();
header('Content-Type: text/xml;charset='.$this->encoding);
header('Content-Length: '.(function_exists('mb_strlen') ? mb_strlen($wsdl,'8bit') : strlen($wsdl)));
echo $wsdl;
}
根据提供web service的类或者对象的定义生成和显示WSDL。
参见
- generateWsdl
run()
方法
public void run()
|
public function run()
{
header('Content-Type: text/xml;charset='.$this->encoding);
if(YII_DEBUG)
ini_set("soap.wsdl_cache_enabled",0);
$server=new SoapServer($this->wsdlUrl,$this->getOptions());
Yii::app()->attachEventHandler('onError',array($this,'handleError'));
try
{
if($this->persistence!==null)
$server->setPersistence($this->persistence);
if(is_string($this->provider))
$provider=Yii::createComponent($this->provider);
else
$provider=$this->provider;
if(method_exists($server,'setObject'))
$server->setObject($provider);
else
$server->setClass('CSoapObjectWrapper',$provider);
if($provider instanceof IWebServiceProvider)
{
if($provider->beforeWebMethod($this))
{
$server->handle();
$provider->afterWebMethod($this);
}
}
else
$server->handle();
}
catch(Exception $e)
{
if($e->getCode()!==self::SOAP_ERROR) // non-PHP error
{
// only log for non-PHP-error case because application's error handler already logs it
// php <5.2 doesn't support string conversion auto-magically
Yii::log($e->__toString(),CLogger::LEVEL_ERROR,'application');
}
$message=$e->getMessage();
if(YII_DEBUG)
$message.=' ('.$e->getFile().':'.$e->getLine().")\n".$e->getTraceAsString();
// We need to end application explicitly because of
// http://bugs.php.net/bug.php?id=49513
Yii::app()->onEndRequest(new CEvent($this));
$server->fault(get_class($e),$message);
exit(1);
}
}
处理web service请求。