Автоматическое обнаружение мыла Zend и nillable="true" в сгенерированном WSDL

Я использую автообнаружение мыла 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" к этому элементу)?

1 ответ

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

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

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

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

Другие вопросы по тегам