jelix / soap-server-module
模块,用于在Jelix应用中实现SOAP服务器
Requires
- jelix/webservice-helper: ^1.5.3
Conflicts
- jelix/jelix: <1.7.0-rc.1
README
这是一个Jelix模块,提供了Soap Response对象和SOAP协调器,允许在基于Jelix框架构建的应用程序中实现SOAP服务。它还可以自动生成WSDL内容。
它使用PHP SOAP API,因此您需要配置您的Web服务器以包含此扩展。
此模块适用于Jelix 1.7.x及更高版本。查看jelix/jelix存储库以查看Jelix 1.7之前的版本的历史记录。
设置模块
像其他Jelix模块一样手动安装,或者如果您使用Composer安装了Jelix 1.7+,则可以使用Composer。
在您的项目中
composer require "jelix/soap-server-module"
启动您的应用程序的配置器以启用该模块
php dev.php module:configure jsoap
创建了一个新的入口点,并将其声明在您的app/system/framework.ini.php
和app/system/urls.xml
中。
然后启动安装程序以激活该模块
php install/installer.php
使用模块
控制器
由于这是一个特定类型的请求,控制器文件名必须以".soap.php"结尾。例如,对于“默认”控制器:default.soap.php
。(它可以与“默认”经典控制器如“default.classic.php”共存)。
SOAP控制器的方法
控制器的内容类似于经典控制器,但有少量差异。您将检索一个jResponseSoap
对象作为响应,其别名为“soap”。
class defaultCtrl extends jController {
/**
* Test with a simple parameter
* @externalparam string $name
* @return string
*/
function hello() {
$resp = $this->getResponse('soap');
$resp->data = "Hello ".$this->param('name');
return $resp;
}
}
控制器的每个动作实际上是一个“soap方法”。
声明参数类型和返回值类型
“soap方法”有参数,应该接收一个值。您应该指定它们的类型,以便Jelix可以正确生成soap和xsl消息。
为此,只需添加“文档注释”(如phpdoc),并使用一些@externalparam
标签和一个@return
标签来指示参数类型和返回值类型(我们使用@externalparam
而不是@param
,因为这些不是PHP方法的参数)。示例
@externalparam string $myparameter
这里指示soap参数$myparameter
是一个字符串。其他可能的类型是“integer”,“int”,“boolean”,“float”。
如果您想指示一个数组,请添加类型名称后跟[]
@externalparam string[] $array_of_string
如果是关联数组,请使用[=>]
@externalparam string[=>] $array_of_string
如果您想使用复杂类型,如用于参数或返回值的自己的对象。这些对象的类应包含在控制器的文件中,或应能够自动加载。
这里是一个用于参数的对象示例MyTestStruct
/** * Struct used for tests */ class MyTestStruct { /** * @var string */ public $name = 'Dupont'; /** * @var string */ public $firstName = 'Bertrand'; /** * @var string */ public $city = 'Paris'; }
请注意使用必要的"@var"关键字来指示每个属性的类型。
然后,在您的控制器中,不要忘记为参数或返回值指示MyTestStruct
/** * for this method, we receive a MyTestStruct and return a MyTestStruct object * @externalparam MyTestStruct $input * @return MyTestStruct */ function receiveObject() { $resp = $this->getResponse('soap'); $input = $this->param('input'); $input->name = 'Name updated'; $resp->data = $input; return $resp; }
当然,MyTestStruct
可以有一些具有复杂类型的属性
/** * An other struct used for test, this one have an other object as member propertie */ class MyTestStructBis { /** * @var MyTestStruct */ public $test; /** * @var string */ public $msg = 'hello'; function __construct(){ $this->test = new MyTestStruct(); } }
检索服务的URL
您可以通过以下方式检索soap操作的URL
$url = jUrl::get("mymodule~myaction@soap");
使用WSDL服务
当您使用SOAP协议时,您应该提供一些WSDL文件,这些文件允许SOAP客户端了解可用的SOAP方法。
jsoap模块提供了生成WSDL的功能。它包含一个名为"WSDL"的控制器,其中包含一个wsdl()
方法。因此,只需将此操作的URL指示给您的SOAP客户端即可。
http://mysite.com/index.php/jsoap/WSDL/wsdl?service=aModule~aController
请注意,您应该提供一个"service"参数,以指示包含Web服务的控制器。您可以有多个SOAP控制器,但无法自动为应用程序中实现的所有SOAP Web服务返回WSDL文件。
您可以通过调用WSDL控制器的index()
方法来显示SOAP服务列表的HTML版本。
http://mysite.com/index.php/jsoap/WSDL?service=aModule~aController
单元测试
单元测试位于Testapp中,在jelix/jelix仓库中。