作者:zccst
1,定义Service Provider
Yii依靠文档注解(doc comments)和类反射(class reflection)来识别哪个方法可以被远程调用,包括他们的参数和返回值。
我们定义服务器端的类,继承CController,如下面的例子所示:
class StockController extends CController{
/**
* @param String the symbol of the stock
* @return float the stock price
* @soap
*/
public function getPrice($symbol){
$prices = array('IBM'=>100, 'GOOGLE'=>350);
return isset($prices[$symbol]) ? $prices[$symbol] : 0;
// ... return stock price for $symbol
}
}
在上面的例子中,我们定义了方法getPrice(使用@soap)作为一个可供远程调用的API,并且通过文档注解(doc comments)来指定参数和返回值的数据类型。
批注:后面会讲数据类型可分为基本数据类型和复合数据类型。
2,定义 Web Service Action
既然前面已知服务器端类是继承自CController,所以需要定义一个action,将服务暴露出去。继续上面的例子,我们仅仅在StockController增加如下代码:
class StockController extends CController{
/*********** 增加 start **************/
public function actions(){
return array(
'quote'=>array(
'class'=>'CWebServiceAction'
),
);
}
/*********** 增加 end **************/
/**
* @param String the symbol of the stock
* @return float the stock price
* @soap
*/
public function getPrice($symbol){
$prices = array('IBM'=>100, 'GOOGLE'=>350);
return isset($prices[$symbol]) ? $prices[$symbol] : 0;
// ... return stock price for $symbol
}
}
至此,如果我们访问地址:http://hostname/path/to/index.php?r=stock/quote
我们将得到一个包含大量XML格式的内容,实际上它就是上面Web Service定义的WSDL。
批注:缺省情况下,CWebServiceAction默认当前controller就是Service Provider,这就是为什么上面直接在StockController里定义getPrice方法。
3,在客户端调用:(可以使用多种语言)
$client = new SoapClient('http://hostname/path/to/index.php?r=stock/quote');
echo $client->getPrice('GOOGLE');
//运行上面的脚本,通过Web或命令行方式,可以得出结果:350
4,关于参数和返回值的数据类型
在实际应用中,参数和返回值的数据类型可分为基本数据类型和复合数据类型。
(1)基本类型数据
string , integer , float, boolean, date, time, datetime, array , object, mixed
(2)复合类型数据
如果是复合数据类型,则复合数据类型会通过类的形式表示,这时它的每一个public的数据项都需要使用@soap来进行文档注解(doc comments)。例如:
class outsource_header {
/**
* @var string 访问密钥, a和b之间的访问控制
* @soap
*/
public $token;
/**
* @var integer 外包单号
* @soap
*/
public $id;
/**
* @var string 该外包单对应的机房名称
* @soap
*/
public $idc_name;
/**
* @var outsource_handler 处理人信息
* @soap
*/
public $handler; // 处理人信息
}
需要注意的是,如果想让client端收到复合类型数据,除了上面给出的类定义外,还需要在Service Provider的actions方法里增加配置项classMap=>array('outsource_header')。如下面所示:
class XXController extends CController{
public function actions(){
return array(
'service'=>array(
'class'=>'CWebServiceAction',
//增加 classMap 配置项
'classMap'=>array(
'outsource_header',
),
),
);
}
}
此外,复合数据类型也可以使用数组(Array),通过[]向基本数据类型或复合数据类型的末尾追加的方式。例如,
class PostController extends CController{
/**
* @return Post[] a list of posts
* @soap
*/
public function getPosts(){
return Post::model()->findAll();
}
}
class Post extends CActiveRecord{
/**
* @var integer post ID
* @soap
*/
public $id;
/**
* @var string post title
* @soap
*/
public $title;
public static function model($className=__CLASS__){
return parent::model($className);
}
}
该实例,调用getPosts方法时,将返回一个数组。
5,拦截远程方法调用(Intercepting Remote Method Invocation)
通过实现[IWebServiceProvider]接口,可以拦截所有方法,在[IWebServiceProvider::beforeWebMethod],这个provider可以获取当前CWebService实例,并通过CWebService::methodName来获取当前请求的方法名,它可以返回false,如果这个远程方法因某些原因(比如未经授权的访问)不应被调用。
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
相关推荐
Yii 2 的 SOAP 服务器扩展 ... 注意,在服务类中,远程可调用方法必须是带有包含“@soap”标记的文档注释块的公共方法。 class ApiController extends Controller { /** * @inheritdoc */ public function acti
要么跑 composer require --prefer-dist mongosoft/yii2-soap-client "*"或添加 " mongosoft/yii2-soap-client " : " * " 到composer.json文件的require部分。用法您需要设置soap客户端应用程序组件: 'components'...
商城开发的配置 yii2的 里面是代码可以详细的知道所有
Yii2 Configloader:从配置文件和环境变量构建配置数组
Yii中使用PHPExcel,相信你看完本文档之后,疑点瞬即消失
YII配置详解以及开发规范
编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中...
yii1.1中文文档 yii框架中文手册教程.pdf
yii框架中文手册教程和YII模板 我很辛苦才找到的
对于想使用 Yii 的开发者而言,熟悉面向对象编程(OOP)会使开发更加轻松,因为 Yii 就是一个纯 OOP 框架。 Yii 适合做什么? Yii 是一个通用 Web 编程框架,能够开发任何类型的 Web 应用。它是轻量级的,又装配了很...
yii的小部件使用的总结,快速生成增删改查,感觉不同的需求进行逻辑修改!
很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架
Yii2.0中文学习手册
yii2命令行中使用migration备份和还原数据库
YII框架中文手册,希望帮助需要帮助的人!
yii中文手册,你可以通过两种方式安装 Yii:使用 Composer 或下载一个归档文件。推荐使用前者,这样只需执行一条 简单的命令就可以安装新的扩展或更新 Yii 了。 注意:和 Yii 1 不同,以标准方式安装 Yii 2 时会同时...
采用的方式是分析框架的源代码,尝试从根上进行理解和阐述,并融入个人使用Yii开发的一些经验和教训。 通过本书,你将不仅仅了解到Yii怎么使用的实操技巧,还将掌握其实现的技术原理和内幕。 更为重要的是,接触...
关于YII2代码配置那一部分,给出的是官方的链接,如果想要这部分,请不用下载,直接去官方阅读,以免浪费资源分哦
yii2 swoole:让yii2运行在swoole上 , 运行在swoole上的yii2是运行在php-fpm上yii2的5倍以上
本文实例讲述了YII2框架中日志的配置与使用方法。分享给大家供大家参考,具体如下: YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用。 我们在config/web.php中配置如下: return [ //log...