PHP SOAP возвращает массив одноименных элементов с атрибутами

Я пытаюсь вернуть значения в том виде, в каком они отправляются на мой сервер мыла, чтобы они имели одинаковую структуру XML.

Вот пример запроса для нескольких политик с различными атрибутами.

<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl = "https://customer-soap.example.com/?WSDL">
   <soapenv:Header/>
   <soapenv:Body>
      <wsdl:SendPoliciesRequestInput>
         <sesid>someid</sesid>
         <!--Optional:-->
         <policy product = "product1" company = "ges1" polizzenNr = "pol1" premium = "1" expiry = "01.01.2000" info = "blabla1"/>
         <policy product = "product2" company = "ges2" polizzenNr = "pol2" premium = "2" expiry = "02.01.2000" info = "blabla2"/>
      </wsdl:SendPoliciesRequestInput>
   </soapenv:Body>
</soapenv:Envelope>

В моем php-коде это переводится в объект, содержащий sesid и массив элементов policy, например: (print_r($request))

stdClass Object
(
    [sesid] => someid
    [policy] => Array
        (
            [0] => stdClass Object
                (
                    [product] => product1
                    [company] => ges1
                    [Nr] => pol1
                    [premium] => 1
                    [expiry] => 01.01.2000
                    [info] => blabla1
                )

            [1] => stdClass Object
                (
                    [product] => product2
                    [company] => ges2
                    [Nr] => pol2
                    [premium] => 2
                    [expiry] => 02.01.2000
                    [info] => blabla2
                )

При попытке вернуть именно этот объект вызывающей стороне следующий код

<php
class Example
{
  public function SendPolicies($request)
  {
    return $request;
  }
}

такие выходы:

<soapenv:Envelope xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl = "https://customer-soap.example.com/?WSDL">
       <soapenv:Header/>
       <soapenv:Body>
          <wsdl:SendPoliciesRequestOutput>
             <sesid>someid</sesid>
             <!--Optional:-->
             <policy />
          </wsdl:SendPoliciesRequestOutput>
       </soapenv:Body>
    </soapenv:Envelope>

Я пробовал несколько подходов, включая создание SoapVar, но это только реструктурировало бы объекты, а не создавало вывод, точно такой же, как ввод.

Мы очень ценим любую помощь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
455
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я использовал решение горожане: https://stackoverflow.com/a/24894102/8247069

So not ideal. Another way to do it would be to write the XML yourself:

$soap->param = new SoapVar("<param attrName='attributeName'>value</param>", XSD_ANYXML);

I don't like either way, but when you've got a deadline, you go with what works.

Проблема, похоже, в том, что мой код находится на стороне сервера, поэтому (насколько мне удалось выяснить во время моего исследования) я не могу переключиться в режим WSDL, хотя мой сервер запущен с использованием WSDL.

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