Автоматическое обнаружение мыла Zend и nillable = "true" в сгенерированном WSDL - PullRequest
4 голосов
/ 18 мая 2011

Я использую Автоматическое обнаружение мыла Zend для создания файла WSDL для моего веб-сервера. Проблема в том, что каждый элемент каждого complexType по умолчанию равен 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>

EDIT2: Я только что обнаружил, что для объявления элемента как обязательного / необязательного необходимо использовать minOccurs/maxOcurrs. По умолчанию они оба равны 1, поэтому каждый элемент является обязательным по умолчанию. Чтобы объявить необязательный элемент, вы объявляете его с помощью minOccurs="1". Nillable только для того, чтобы позволить элементам быть пустыми. Опять же, как мне объявить элемент необязательным (поэтому Zend добавляет minOccurs = "0" к этому элементу)?

Ответы [ 2 ]

11 голосов
/ 18 мая 2011

Если в определении функции установлено значение по умолчанию, оно будет иметь значение nilble.

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. Убедитесь, что ваш код правильно обрабатывает данные.

Если это не сработает, дайте мне знать!

0 голосов
/ 06 декабря 2018

На форуме Zend доступен функциональный патч .Он заключается во взломе DefaultComplexType.php для добавления управления атрибутами minOccurs и maxOccurs.Это прекрасно работает и улучшает взаимодействие с некоторыми веб-сервисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...