Я использую автообнаружение мыла Zend для создания WSDL-файла для моего веб-сервера. Проблема в том, что каждый элемент каждого complexType по умолчанию имеет nillable="true"
. Как я объявляю элементы по мере необходимости? Я читал PHPDoc, но ничего не нашел.
EDIT: Код:
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" к этому элементу)?
если у вас есть значение по умолчанию, заданное в определении вашей функции, оно будет nillable.
public function myMethod($argument = 'hello') { // $argument is nillable }
Если это не так, можете ли вы разместить свой код с блоками doc?
РЕДАКТИРОВАТЬ: Ваш пример кода проясняет многое.
Если вы посмотрите на 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. Однако убедитесь, что ваш код правильно обрабатывает данные.
Если это не сработает, дайте мне знать!