Zend Framework 2 SOAP AutoDiscover 和复杂类型

2024-07-04

我正在准备 SOAP 服务器并使用以下代码生成 WSDL:

//(... Controller action code ...)
if (key_exists('wsdl', $params)) {
    $autodiscover = new AutoDiscover();
    $autodiscover->setClass('WebServiceClass')
                 ->setUri('http://server/webserver/uri');
    $autodiscover->handle();
} else {
    $server = new Server(null);
    $server->setUri($ws_url);
    $server->setObject($this->getServiceLocator()->get('MyController\Service\WebServiceClass'));
    $server->handle();
}

//(... Controller action code ...)

但在我的 WebService 方法之一中,我有一个 Array 类型的参数,其中每个元素的类型为“MyOtherClass”,如下所示:

    /**
     * Add list of MyOtherClass items
     *
     * @param MyOtherClass[]    $items
     *
     * @return bool
     */
    function add($items) {
        // Function code here
    }

当我尝试生成 WSDL 时,出现以下错误:

PHP Warning:  DOMDocument::loadXML(): Empty string supplied as input in /<zend framweork path>/Server/vendor/zendframework/zendframework/library/Zend/Soap/Server.php on line 734

或者这个异常:

Cannot add a complex type MyOtherClass[] that is not an object or where class could not be found in "DefaultComplexType" strategy.

当我在代码中添加如下内容时:

//(...)
if (key_exists('wsdl', $params)) {

    $autodiscover = new AutoDiscover();
    $autodiscover->setClass('WebServiceClass');
    $autodiscover->setUri($ws_url);

    $complex_type_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex();
    $complex_type_strategy->addComplexType('MyOtherClass');
    $autodiscover->setComplexTypeStrategy($complex_type_strategy);
    $autodiscover->handle();
} else {
//(...)

我收到以下错误消息:

Fatal error: Call to a member function getTypes() on a non-object in /<project dir>/vendor/zendframework/zendframework/library/Zend/Soap/Wsdl/ComplexTypeStrategy/AbstractComplexTypeStrategy.php on line 54

在简历中,问题是:如何了解用作参数的新自定义类型的 WSDL?

Thanks


我做了类似的事情,这是一个示例代码:

/* code.... */
if (array_key_exists('wsdl', $this->request->getQuery()) || array_key_exists('WSDL', $this->request->getQuery())) {

                    $auto = new \Zend\Soap\AutoDiscover(new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence());

                    $auto->setClass($controllerClassName);
                    $auto->setUri(sprintf('%s://%s%s', \Application\Bootstrap::getServiceManager()->get('config')[APPLICATION_ENV]['webServer']['protocol'],
                                                     $this->request->getUri()->getHost() , $this->request->getUri()->getPath()));
                    $auto->setServiceName(ucfirst($this->request->getModuleName()) . ucfirst($this->request->getControllerName()));

                    header('Content-type: application/xml');

                    echo $auto->toXML();



                } elseif (count($this->request->getQuery()) == 0) {

                    $this->preDispatch();

                    $wsdl = sprintf('%s://%s%s?wsdl', \Application\Bootstrap::getServiceManager()->get('config')[APPLICATION_ENV]['webServer']['protocol'],
                                                     $this->request->getUri()->getHost() , $this->request->getUri()->getPath());

                    $soapServer = new \Zend\Soap\Server($wsdl);
                    $soapServer->setClass($controllerClassName);
                    $soapServer->handle();
                }

/* code */

这是自动发现将根据注释生成 wsdl 的类之一的函数签名片段:

/**
 * Allows to search for a patient based on the patient id
 *
 * @param int $id
 * @return \ViewModels\PatientViewModel
 * @throws \Application\Exception
 */
protected function searchPatientById($id) {
 /* .... code */

这是类 \ViewModels\PatientViewModel 和 \ViewModel\DiagnosisViewModel请注意这里我如何使用注释来声明一个字段包含一个复杂类型的数组,然后如何将其转换为 wsdl 上的诊断视图模型数组

    namespace ViewModels;

    class PatientViewModel {

        /**
         * @var int
         * */
        public $id;

        /**
         * @var string
         * */
        public $firstname;

        /**
         * @var string
         * */
        public $lastname;

        /**
         *** @var \ViewModels\DiagnosisViewModel[]**
         * */
        public $diagnosis;

    }

class DiagnosisViewModel {

    /**
     * @var int
     */
    public $id;

    /**
     * @var string
     */
    public $name;

}

这是生成的 WSDL

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://soa.local/soap/Sample/Main" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="SampleMain" targetNamespace="http://soa.local/soap/Sample/Main">
    <types>
        <xsd:schema targetNamespace="http://soa.local/soap/Sample/Main">
            <xsd:complexType name="DiagnosisViewModel">
                <xsd:all>
                    <xsd:element name="id" type="xsd:int" nillable="true"/>
                    <xsd:element name="name" type="xsd:string" nillable="true"/>
                </xsd:all>
            </xsd:complexType>
            **<xsd:complexType name="ArrayOfDiagnosisViewModel">
                <xsd:sequence>
                    <xsd:element name="item" type="tns:DiagnosisViewModel" minOccurs="0" maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:complexType>**
            <xsd:complexType name="PatientViewModel">
                <xsd:all>
                    <xsd:element name="id" type="xsd:int" nillable="true"/>
                    <xsd:element name="firstname" type="xsd:string" nillable="true"/>
                    <xsd:element name="lastname" type="xsd:string" nillable="true"/>
                    <xsd:element name="diagnosis" type="tns:ArrayOfDiagnosisViewModel" nillable="true"/>
                </xsd:all>
            </xsd:complexType>
        </xsd:schema>
    </types>
    <portType name="SampleMainPort">
        <operation name="searchPatientById">
            <documentation>Allows to search for a patient based on the patient id</documentation>
            <input message="tns:searchPatientByIdIn"/>
            <output message="tns:searchPatientByIdOut"/>
        </operation>
    </portType>
    <binding name="SampleMainBinding" type="tns:SampleMainPort">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="searchPatientById">
            <soap:operation soapAction="http://soa.local/soap/Sample/Main#searchPatientById"/>
            <input>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soa.local/soap/Sample/Main"/>
            </input>
            <output>
                <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soa.local/soap/Sample/Main"/>
            </output>
        </operation>
    </binding>
    <service name="SampleMainService">
        <port name="SampleMainPort" binding="tns:SampleMainBinding">
            <soap:address location="http://soa.local/soap/Sample/Main"/>
        </port>
    </service>
    <message name="searchPatientByIdIn">
        <part name="id" type="xsd:int"/>
    </message>
    <message name="searchPatientByIdOut">
        <part name="return" type="tns:PatientViewModel"/>
    </message>
</definitions>

请注意,只需更改策略和正确的文档块注释即可实现这一目标。

希望此片段可以帮助您找到解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zend Framework 2 SOAP AutoDiscover 和复杂类型 的相关文章

  • codeigniter 中的会话超时动态

    我有关于 codeigniter Timeout 的问题 我知道配置文件夹手动设置会话超时 如 l config sess expiration 123 但我需要网站管理员在管理页面动态管理会话超时 请帮助我如何实现这个逻辑 我尝试了这个逻
  • 如何解决phpmyadmin超时问题?

    我想要导入巨大的 at least300 mb 通过 phpMyAdmin 的 SQL 脚本 我试过了 post max size 750M upload max filesize 750M max execution time 300 m
  • WordPress 如何在没有重写映射的情况下重写 URL?

    WordPress 站点的 htaccess 文件如下所示
  • PHP项目的文件夹结构[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我决定从头开始完全重写我的旧 PHP 项目 之前 我每一页都有一个文件 现在我想使用具有一个入口点的 MVC 模式方法 该项目本身相当大 我正在
  • 如何将路径附加到 .htaccess 中的 PHP include_path

    目前在我的网站上我使用的语句如下 include head php include head php include head php 取决于我有多少嵌套文件夹 我确信有更好的方法来做到这一点 我相信 htaccess是解决方案 但我不确定
  • 当我访问不存在路由的类时,如何在codeIgniter中设置默认函数?

    控制器是这样的 class Abc extends CI controller public function index public function f1 如果网址是http host app Abc index它得到函数索引如果网址
  • 不使用 PHPUnit 测试受保护/私有方法时的代码覆盖率

    我知道可以使用反射或其他解决方法使用 PHPUnit 测试私有 受保护的方法 但大多数消息来源告诉我 这是not为类内部的私有方法编写测试的最佳实践 您应该像测试一个 黑匣子 一样测试该类 您只需通过比较输入与输出来测试预期行为 而不考虑内
  • 按类别(术语)过滤 WooCommerce $order 商品

    在这个问题中 我拥有所有的部分 但我似乎无法将它们组合在一起 我有一个 WooCommerce 订单的打印模板 它以正常方式列出产品 它们存储在数组中的顺序 这又是它们放置在购物篮中的顺序等 但是 我们希望它们按类别 术语 分组 所以这意味
  • PHP 字符串中的 JavaScript 数组

    我正在开发一个具有数千个值的应用程序 我正在尝试用 JavaScript 创建一个动态数组 我正在使用 AJAX 来获取我的值 所以我必须从 PHP 创建一个字符串 它应该能够在 JavaScript 中从字符串转换为数组 如何在 PHP
  • 函数内的函数。?

    此代码生成的结果为 56 function x y function y z return z 2 return y 3 y 4 y x y y y echo y 知道里面发生了什么吗 我很困惑 X 返回 值 3 而 Y 返回 值 2 给定
  • 调整大小然后裁剪 PHP

    好的 基本上我希望所有图像都是 170x170px 的正方形 因此 如果图像不是正方形 我希望调整它的大小 然后在中间裁剪 我花了很多时间玩这个 但一无所获 我已经让它裁剪较大图像的一部分等 但我特别需要调整图像大小 然后裁剪 任何帮助将不
  • 通过 AJAX 调用的 PHP header() 无法正常工作

    我是网络开发新手 现在我正在开发网站上的登录功能 我使用 Javascript AJAX 获取用户名和密码并将其发送到 PHP 文件以在 MYSQL 数据库上进行验证 这就是我要做的 我的问题是为什么 header 函数不能正常工作 我想在
  • 是否可以通过简单地交换一些文件来恢复 Postgres 数据库以提高速度?

    这是一个一般的 Postgres 备份和恢复方法问题 基于以下非生产服务器 即本地测试服务器 的用例 我有一个大约 20gb 的数据库 在测试 php 脚本期间我会破坏它 这将导致需要经常删除它并重新创建它 运行转储的 SQL 来恢复它需要
  • 在 PHP 中组合数组

    尝试学习 PHP 中的数组 为简洁起见 发布了片段 HTML 表单在这里 p What are your favorite type of cookies p
  • 即使选择数据库后也会出现“未选择数据库”错误

    我已经选择了数据库 但由于某种奇怪的原因 它仍然说它没有被选择 连接线 location localhost user user pass pass Database Selection link mysql connect locatio
  • PHP url 函数和子域

    我有一个网站thenoblesite com 它有一些子域 即 download thenoblesite com壁纸 thenoblesite com etc 子域的页面位于主 htdocs 文件夹中 即 httpdocs downloa
  • 如何使用 PHP 在文件上传后重定向用户

    正如标题所说 我希望在用户上传文件后将用户重定向回主页 到目前为止 这些代码所做的只是显示一个包含相关信息 文件名 文件大小等 的页面 我想要将他们重定向到自定义成功页面 HTML
  • 双因素认证系统

    我正在尝试使用 SMS 作为第二种身份验证方法来设计一个双因素身份验证系统 在 PHP 上 这是一个测试项目 任何人都可以帮助我设计这项服务吗 这将是一个基于网络的系统 下面是我到目前为止所做的 客户端输入用户名和密码后 网站将向我们的服务
  • 从 android 发送数组并使用 Volley 在 PhP 服务器接收

    你好我想发送一个字符串值数组到 PhP 服务器和 PhP 解码并将它们存储在 PhP 变量中 这是我在 android studio 的代码 private void getEventDetailRespond RequestQueue r
  • 如何构建我的 PHP 项目?

    我即将开始另一个大型 PHP 项目 这次 我打算让项目文件夹变得整洁 所以我有几个关于保持我的项目干净和干燥的问题 如何区分 PHP 源文件和浏览器应访问的 PHP 文件 换句话说 我如何清楚哪些 PHP 文件提供输出 哪些提供函数或类定义

随机推荐

  • 调整闪亮代码中计算两点之间距离的方式

    下面的闪亮代码使用以下命令生成两点之间的路线googleway功能 请注意 此外 还计算了两点之间的距离 但这是欧氏距离 而不是使用googleway功能 计算距离的正确方法是执行以下操作 test lt google directions
  • 实体框架 5 线程敏捷性

    EntityFramework 代码深处抛出 NullReferenceException EF bug 但我的问题是关于 Entity Framework v5 和 WebAPI 异步控制器操作 在这里很难重新创建重现 但代码本质上执行以
  • 使用 .Net 和 SQL Server 2005 保存/加载图片的最佳方式?

    在销售产品的网页中处理产品图片的典型方法是什么 假设我有一个包含书籍或计算机组件等的数据库 例如 所有这些都有自己的示例图片 我应该将它们作为二进制数据保存到数据库中 还是以某种方式在代码隐藏中处理它们 将它们保存到一个目录中保存到数据库产
  • python中返回概率的多类线性SVM

    如何实现多类线性 SVM 它返回测试样本的概率矩阵 训练样本 mxn 火车标签 mxc 测试标签 mxc 其中列具有每个类别的概率 sklearn 中执行 one vs the rest 的函数线性SVC http scikit learn
  • 尝试在 C# 中使用 INATExternalIPAddressCallback 获取 NAT 外部 IP 地址

    如何使用 Windows 库获取 NAT 的外部 IP 地址 我正在尝试查找有关 INATExternalIPAddressCallback 的任何信息 但只在 C 中找到了一个使用不可用的 C 接口的示例 任何指导将不胜感激 Karl 抱
  • ruby 中 CSV.open( ) 的第二个参数/参数是什么?

    我想我在这里遗漏了一些非常明显的东西 但是每个人为 CSV open 方法输入的第二个参数是什么 在本例中是 wb 我已经看到这里放了其他字母 但没有人真正解释了它的作用 它有什么作用 CSV open path to file csv w
  • 即使选择数据库后也会出现“未选择数据库”错误

    我已经选择了数据库 但由于某种奇怪的原因 它仍然说它没有被选择 连接线 location localhost user user pass pass Database Selection link mysql connect locatio
  • UICollectionView PerformBatchUpdates:如果视图需要布局,则意外断言?

    如果我打电话 UICollectionView performBatchUpdates 从内部viewWillAppear 里面viewDidAppear 在这些方法之间 或者每当集合视图尚未由更大的 UIView 视图层次结构布局时 集合
  • 通过鼠标滚轮按下事件在网站上滚动了多少像素?

    我正在编写一个自定义滚动条并正在捕捉mousewheel事件 我使用它来调整我想要滚动的元素的scrollTop 向下滚动的像素数是否有标准 或者因系统而异 我在最新版本的 Firefox 中显示 114px 许多鼠标驱动程序允许您设置鼠标
  • UML 中的组合

    在 UML 图中考虑组合时 我们应该在逻辑或实现意义上使用它 这两个术语的示例 实施 机场将包含对国家 地区的引用 换句话说 一个国家是机场的一部分 逻辑 一个国家可以有零个或多个机场 换句话说 机场是国家的一部分 从上图中 哪种情况显示了
  • 使用 Google Apps 脚本,如何替换 Google 表格模板中的文本以制作新表格?

    我有一个谷歌表格 https docs google com spreadsheets d 17qtLpnFTiMoE6blELSTQhtxkWa1hjjzI PcaY 3cS1Q edit resourcekey null gid 465
  • 如何创建每 24 小时运行一次的活动?

    我需要每 24 小时运行一次 delete tags from tags left join tagowners on tags id tagowners tagId where tagowners tagId is null CREATE
  • 在Python中写入具有特定权限的文件

    我正在尝试创建一个仅用户可读和可写的文件 0600 唯一的方法是使用os open 如下 import os fd os open path to file os O WRONLY 0o600 myFileObject os fdopen
  • C 中枚举类型溢出?

    如果我有一个枚举类型 例如 enum week sunday 0 monday tuesday wednesday thursday friday saturday 我有 enum week day day saturday day 一天的
  • 从 Java 访问 Kotlin 类对象

    我有一个 Kotlin 类 它有一个类对象 例如 public class Foo public class object public val SomeValue Int 0 如果我从 Java 使用此类 如何访问类对象内的 SomeVa
  • postgres:从命令行在数据库中创建表

    我试图在 postgres 中创建一个表 但它最终出现在错误的数据库中 这就是我所做的 首先在我的 sql 脚本中创建一个用户和一个数据库 然后创建一个表 代码会解释更多 drop database if exists sinfonifry
  • 如何计算 django 连接表中对象的数量?

    我的问题很简单 我有Users谁拥有Assets or Assets属于用户的如果您愿意 但我无法检索其数量 计数 Assets each User有 我知道这对你们大多数人来说可能听起来很愚蠢 但我是 python django 来自 P
  • 浏览器在使用 CSS 缩放图像时通常使用什么算法?

    我想得到canvas以与 CSS 相同的视觉保真度渲染缩放图像 根据我的测试 在 Chrome 版本 43 0 2357 130 中完成 它似乎不是 Lanczos3 即使我的测试重采样范围 http entropymine com res
  • Java从受限层调用方法

    我什至不确定这是否可行 但我想询问社区的总体意见 我必须解决以下问题 我的项目有 2 层 一个核心层和一个业务层 该核心层提供业务层 这时候Business类就可以导入Core类 为所欲为了 核心类只能导入核心类并使用其方法 禁止访问业务类
  • Zend Framework 2 SOAP AutoDiscover 和复杂类型

    我正在准备 SOAP 服务器并使用以下代码生成 WSDL Controller action code if key exists wsdl params autodiscover new AutoDiscover autodiscover