Функция SOAP возвращает stdClass - PullRequest
0 голосов
/ 05 июня 2019

Я получаю ошибку PHP каждый раз, когда пытаюсь получить доступ к свойству объекта из SOAP WSDL.

Я предполагаю, что он должен возвращать тип ассоциативного массива, но я попытался сделать print_r, и класс stdClass все еще там.

Это структура WSDL для объекта продукта:

<complexType name="catalogProductReturnEntity">
<all>
<element name="product_id" type="xsd:string" minOccurs="0"/>
<element name="sku" type="xsd:string" minOccurs="0"/>
<element name="set" type="xsd:string" minOccurs="0"/>
<element name="type" type="xsd:string" minOccurs="0"/>
<element name="categories" type="typens:ArrayOfString" minOccurs="0"/>
<element name="websites" type="typens:ArrayOfString" minOccurs="0"/>
<element name="created_at" type="xsd:string" minOccurs="0"/>
<element name="updated_at" type="xsd:string" minOccurs="0"/>
<element name="type_id" type="xsd:string" minOccurs="0"/>
<element name="name" type="xsd:string" minOccurs="0"/>
<element name="description" type="xsd:string" minOccurs="0"/>
<element name="short_description" type="xsd:string" minOccurs="0"/>
<element name="weight" type="xsd:string" minOccurs="0"/>
<element name="status" type="xsd:string" minOccurs="0"/>
<element name="url_key" type="xsd:string" minOccurs="0"/>
<element name="url_path" type="xsd:string" minOccurs="0"/>
<element name="visibility" type="xsd:string" minOccurs="0"/>
<element name="category_ids" type="typens:ArrayOfString" minOccurs="0"/>
<element name="website_ids" type="typens:ArrayOfString" minOccurs="0"/>
<element name="has_options" type="xsd:string" minOccurs="0"/>
<element name="gift_message_available" type="xsd:string" minOccurs="0"/>
<element name="price" type="xsd:string" minOccurs="0"/>
<element name="special_price" type="xsd:string" minOccurs="0"/>
<element name="special_from_date" type="xsd:string" minOccurs="0"/>
<element name="special_to_date" type="xsd:string" minOccurs="0"/>
<element name="tax_class_id" type="xsd:string" minOccurs="0"/>
<element name="tier_price" type="typens:catalogProductTierPriceEntityArray" minOccurs="0"/>
<element name="meta_title" type="xsd:string" minOccurs="0"/>
<element name="meta_keyword" type="xsd:string" minOccurs="0"/>
<element name="meta_description" type="xsd:string" minOccurs="0"/>
<element name="custom_design" type="xsd:string" minOccurs="0"/>
<element name="custom_layout_update" type="xsd:string" minOccurs="0"/>
<element name="options_container" type="xsd:string" minOccurs="0"/>
<element name="additional_attributes" type="typens:associativeArray" minOccurs="0"/>
</all>
</complexType>

и вот код, который я пытаюсь:

$product = $proxy->catalogProductInfo($sessionId, 38882);
print_r($product->additional_attributes);

Все свойства, кроме additional_attributes (который возвращает класс stdClass), работают отлично.

Сервер возвращает следующее, когда я пытаюсь получить доступ к дополнительным_атрибутам:

Notice: Undefined property: stdClass::$additional_attributes in /Applications/XAMPP/xamppfiles/htdocs/php_test/test.php on line 23

1 Ответ

0 голосов
/ 06 июня 2019

По определению, мыльный клиент php возвращает объекты stdClass на основе используемых им типов xml определений / wsdl.Полученный объект stdClass обычно содержит все атрибуты, описанные в определении.Как вы можете видеть, есть атрибут minoccurs="0" в определении атрибута additional_attributes.Это означает, что это может произойти, но не должно.Таким образом, результат зависит от значений, полученных в ответе xml.

Чтобы избежать такого поведения, просто работайте с классами php, как в следующем примере.Мыльный клиент php принимает параметр classmap, который сообщает клиенту, какой сложный тип использовать с определенным классом.

Entity

class CatalogProductReturnEntity
{
    ...
    public $additional_attributes;
    ...
}

Просто запишитекласс сущности со всеми свойствами, которые определены в определении xml.Этот класс может использоваться как объект для мыльного клиента.Использование этого класса сущности позволяет избежать уведомления PHP о том, что свойство не определено.

Мыльный клиент с картой классов

Следующий шаг - это сообщить мыльному клиенту, чтоклассы для использования со сложными типами.

$client = new \SoapClien($wsdl, [
    'classmap' => [
        'catalogProductReturnEntity' => CatalogProductReturnEntity::class,
    ],
]);

$product = $client->catalogProductInfo($sessionId, 38882);

Теперь клиент знает, какой класс использовать при получении сложного типа с именем catalogProductReturnEntity.Поскольку наш класс сущностей имеет свойство с именем additional_attributes, вы можете легко вызвать его с помощью $product->additiona_attributes.Если не было получено значение для свойства additional_attributes, оно будет равно null.

...