> YII 类库手册 > CWebService
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。

公共属性

属性 类型 描述 定义在
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>&& $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请求。

上一篇:
下一篇: