作者: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,如果这个远程方法因某些原因(比如未经授权的访问)不应被调用。
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
相关推荐
要么跑 composer require --prefer-dist mongosoft/yii2-soap-client "*"或添加 " mongosoft/yii2-soap-client " : " * " 到composer.json文件的require部分。用法您需要设置soap客户端应用程序组件: 'components'...
在“yii1.1中文文档”中,包含了Yii 1.1版本的详尽教程和参考指南。这个版本是Yii框架的一个稳定版本,尽管现在已经有了更新的2.0版本,但仍然有许多项目基于1.1版本运行。文档通常会涵盖框架的基础知识,如MVC...
这使得在不同环境中使用不同的配置变得更加简单,无需修改配置文件。例如,数据库密码可以通过环境变量安全地存储,而不是硬编码在配置文件中。 4. **动态加载**:ConfigLoader 在运行时加载配置,这意味着开发者...
在“yii-1.1.8.r3324.tar.gz”文件中,包含的是Yii框架的1.1.8版本源码,这是一个相对稳定的版本。解压后,开发者可以查看源代码,了解框架内部的工作机制,也可以根据需求进行自定义修改。此外,版本号中的“r3324...
Yii 2 的 SOAP 服务器扩展 ... 注意,在服务类中,远程可调用方法必须是带有包含“@soap”标记的文档注释块的公共方法。 class ApiController extends Controller { /** * @inheritdoc */ public function acti
6. **缓存配置**:类似地,缓存设置也可以根据环境进行调整,例如在生产环境中使用更高效的Redis或Memcached,而在开发环境中使用内存缓存。 7. **安全配置**:在生产环境中,可能会开启GZIP压缩、设置安全的Cookie...
商城开发的配置 yii2的 里面是代码可以详细的知道所有
CComponent 是 Yii 中所有类的基类,提供事件和行为机制,使得扩展功能变得简单。Yii 的组件化设计允许开发者轻松替换如 session、cache 等组件,而无需大规模重构代码。延迟加载机制确保只有在真正需要时才会加载...
通过对Yii框架中小部件的使用以及利用gii工具快速生成增删改查功能的学习,我们可以看到,通过合理利用这些工具和技术,可以极大地提高Web应用的开发效率。特别是在处理常见的CRUD操作时,利用gii工具自动生成代码...
在YII2应用中使用读写分离,可以通过配置数据库组件实现。YII2框架提供了一套完整的数据库访问和操作的API,开发者可以利用这些API方便地配置读写分离。 实现读写分离的方式主要有以下几种: 1. 使用第三方组件或...
**Yii框架中文手册** Yii(读作"易")是一个高性能、基于组件的PHP框架,专为开发...在实际开发中,不断查阅并理解Yii中文手册,结合实例操作,将理论知识转化为实践经验,将有助于提升开发者在Yii框架下的编程技能。
- **组件**:Yii中的所有对象都是组件,可以被配置和复用,增强了代码的灵活性。 - **数据库访问对象(DAO)和ActiveRecord**:提供简便的数据操作,ActiveRecord允许开发者通过对象操作数据库记录。 - **缓存**...
编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中...
1. **MVC模式**:在Yii中,MVC模式用于分离业务逻辑、数据和用户界面。模型(Model)处理数据和业务逻辑,视图(View)负责显示数据,控制器(Controller)协调模型和视图之间的交互。 2. **DAO和ActiveRecord**:...
2. **性能提升**:"运行在swoole上的yii2是运行在php-fpm上yii2的5倍以上"表明使用Swoole后,Yii2应用的处理速度和响应能力显著增强。Swoole的异步非阻塞I/O模型相比传统的PHP-FPM(FastCGI进程管理器)模型,可以...
在终端(或命令提示符)中运行yiic命令,可以在指定的Web根目录下快速生成一个包含基本目录结构和文件的Yii应用。 这个基本的应用包括以下几个页面: - 首页:展示关于应用的信息以及用户登录状态。 - 联系页:...
8. **缓存**:涵盖了多种缓存机制,如文件缓存、内存缓存(如APC、Memcached或Redis),以及如何在应用中集成和使用它们。 9. **安全**:涉及到身份验证、授权、防止XSS和CSRF攻击等安全性相关的主题。 10. **国际...
在Yii2中实现RESTful API,首先需要理解如何配置`modules`。`modules`是Yii2中的一个核心特性,允许我们将应用划分为独立的可重用部分,每个部分称为一个模块。模块可以有自己的模型、视图、控制器和配置,这使得...
- **与其他框架对比**:Yii以其出色的性能、丰富的功能和清晰的文档在众多PHP框架中脱颖而出。它并非源自其他项目的副产品或是第三方代码的集合,而是结合了作者丰富的Web应用开发经验和汲取自其他流行Web编程框架的...