Zend Soap 自动发现和 nillable=“true”在生成的 WSDL 中

发布于 2024-11-08 07:40:12 字数 1361 浏览 0 评论 0原文

我正在使用 Zend Soap 自动发现 生成 WSDL 文件我的网络服务器。问题是每个复杂类型的每个元素都默认为 nillable="true"。如何根据需要声明元素?我读了 PHPDoc 但什么也没找到。

编辑:代码:

class MyService {
    /**
     * Identify remote user.
     *
     * @param LoginReq
     * @return LoginResp
     */
    public function login($request) {
    // Code ....
    }
}

class LoginReq {
    /** @var string */
    public $username;
    /** @var string */
    public $password;
}
class LoginResp {
    /** @var string */
    public $errorCode;
}

生成的WSDL:

  <xsd:complexType name="LoginReq">
    <xsd:all>
      <xsd:element name="username" type="xsd:string" nillable="true"/>
      <xsd:element name="password" type="xsd:string" nillable="true"/>
    </xsd:all>
  </xsd:complexType>
  <xsd:complexType name="LoginResp">
    <xsd:all>
      <xsd:element name="errorCode" type="xsd:string" nillable="true"/>
    </xsd:all>
  </xsd:complexType>

编辑2:我刚刚发现要将元素声明为必需/可选,您需要使用minOccurs/maxOcurrs 。它们都默认为 1,因此默认情况下每个元素都是必需的。为了声明可选元素,您可以使用 minOccurs="1" 来声明它。 Nillable 只是为了允许元素为空。同样,我如何将一个元素声明为可选(因此 Zend 将 minOccurs="0" 添加到该元素)?

i'm using Zend soap autodiscovery to generate a WSDL file for my web server. The problem is that every element of every complexType defaults to nillable="true". How do i declare elements as required? I read PHPDoc but found nothing.

EDIT: The code:

class MyService {
    /**
     * Identify remote user.
     *
     * @param LoginReq
     * @return LoginResp
     */
    public function login($request) {
    // Code ....
    }
}

class LoginReq {
    /** @var string */
    public $username;
    /** @var string */
    public $password;
}
class LoginResp {
    /** @var string */
    public $errorCode;
}

Generated WSDL:

  <xsd:complexType name="LoginReq">
    <xsd:all>
      <xsd:element name="username" type="xsd:string" nillable="true"/>
      <xsd:element name="password" type="xsd:string" nillable="true"/>
    </xsd:all>
  </xsd:complexType>
  <xsd:complexType name="LoginResp">
    <xsd:all>
      <xsd:element name="errorCode" type="xsd:string" nillable="true"/>
    </xsd:all>
  </xsd:complexType>

EDIT2: I just found that to declare an element as required/optional you need to use minOccurs/maxOcurrs. Both of them default to 1, so every element is required by default. In order to declare an optional element, you declare it with minOccurs="1". Nillable is just for allowing elements to be empty. Again, how do i declare an element as optional (so Zend adds minOccurs="0" to that element)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷情 2024-11-15 07:40:12

如果您在函数定义中设置了默认值,则它将为空。

public function myMethod($argument = 'hello') {
    // $argument is nillable
}

如果不是这样,您可以用文档块发布您的代码吗?

编辑:您的代码示例澄清了很多。

如果您查看 Zend/Soap/Wsdl/Strategy/DefaultComplesType.php 的第 76 行,您会看到以下内容:

            // If the default value is null, then this property is nillable.
            if ($defaultProperties[$propertyName] === null) {
                $element->setAttribute('nillable', 'true');
            }

这是确定您的“复杂类型”属性是否可为空的代码。我会尝试更新您的代码以包含字符串的默认值。类似于:

class LoginReq {
    /** @var string */
    public $username = '';
    /** @var string */
    public $password = '';
}

如果您这样做,=== null 的计算结果应为 false。不过,请确保您的代码正确处理数据验证。

如果这不起作用,请告诉我!

if you have a default value set in your function definition, it will be nillable.

public function myMethod($argument = 'hello') {
    // $argument is nillable
}

If that isn't it, can you post your code with doc blocks?

EDIT: Your code sample clarifies a lot.

If you look at Zend/Soap/Wsdl/Strategy/DefaultComplesType.php around line 76, you'll see this:

            // If the default value is null, then this property is nillable.
            if ($defaultProperties[$propertyName] === null) {
                $element->setAttribute('nillable', 'true');
            }

That is the code that is determining if your "complex type" attribute is nillable. I would try updating your code to include a default value for the strings. Something like:

class LoginReq {
    /** @var string */
    public $username = '';
    /** @var string */
    public $password = '';
}

If you do that, the === null should evaluate to false. Be sure your code handles the data validation properly, though.

If that doesn't work, let me know!

少年亿悲伤 2024-11-15 07:40:12

有一个 功能补丁可在 Zend 论坛上找到。它包括破解 DefaultComplexType.php 以添加 minOccurs 和 maxOccurs 属性的管理。这可以完美地工作并提高与某些 Web 服务的互操作性。

There is a functional patch available on the Zend forum. It consists in hacking DefaultComplexType.php to add the management of the minOccurs and maxOccurs attributes. This works perfectly and improves interoperability with some webservices.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文