Можно ли !дописать! в SOAP-заголовок?

Dzen

Новичок
Добрый день,

А можно ли дописать в SOAP заголовок , элементы, если заголовок уже был заранее у нас задан?
Т.е. у нас есть:

PHP:
$client->__setSoapHeaders(
  array(
      new SoapHeader('trans', 'var1', $var1, false),
  )
);
и хотим еще дописать туда:

PHP:
 new SoapHeader('trans', 'var2', $var2, false),
      new SoapHeader('trans', 'var3', $var3, false),

Если делать сразу:

PHP:
$client->__setSoapHeaders(
  array(
      new SoapHeader('trans', 'var1', $var1, false),
      new SoapHeader('trans', 'var2', $var2, false),
      new SoapHeader('trans', 'var3', $var3, false),
  )
);

То всё получается ок.

Но если заголовок УЖЕ сформирован, то как еще дописать var2, var3?

Потому что, делая вторично так:

PHP:
$client->__setSoapHeaders(
  array(
      new SoapHeader('trans', 'var2', $var2, false),
      new SoapHeader('trans', 'var3', $var3, false),
  )
);
ничего не дописывается. ХОТЯ! тут:
http://php.net/manual/ru/soapclient.setsoapheaders.php
сказано, что:
Вызов этого метода перезаписывает предыдущие значения
т.е. хотелось бы в уже сформированный объект:
PHP:
[_encoding] => windows-1251
    [__default_headers] => Array
        (
            [0] => SoapHeader Object
                (
                    [namespace] => trans
                    [name] => var1
                    [data] =>
                    [mustUnderstand] =>
                )
        )
дописать 2 элемента массива, чтобы было:
PHP:
[_encoding] => windows-1251
    [__default_headers] => Array
        (
            [0] => SoapHeader Object
                (
                    [namespace] => trans
                    [name] => var1
                    [data] =>
                    [mustUnderstand] =>
                )
[1] => SoapHeader Object
                (
                    [namespace] => trans
                    [name] => var2
                    [data] =>
                    [mustUnderstand] =>
                )
              [2] => SoapHeader Object
                (
                    [namespace] => trans
                    [name] => var3
                    [data] =>
                    [mustUnderstand] =>
                )
подобный код эффекта не даёт:

PHP:
$wsdl = '.....';
# SOAP settings
ini_set("soap.wsdl_cache_enabled", "0");
# SOAP object
$client = new SoapClient($wsdl,
    array(
        'trace'=> 1,
        'exceptions' => 0,
        'encoding' => 'windows-1251',
    )
);
# SOAP headers
$client->__setSoapHeaders(
  array(
      new SoapHeader('trans', 'var1', $var1, false),
  )
);
print_r($client);


// эта часть ниже, не срабатывает.
# SOAP headers
$client->__setSoapHeaders(
  array(
      new SoapHeader('trans', 'var2', $var2, false),
      new SoapHeader('trans', 'var3', $var3, false)
  )
);
print_r($client); // тот же что и в первый раз, ничего кроме var1 нету в объекте.
в чём ошибка?
 

MiksIr

miksir@home:~$
Можно попробовать $client->__setSoapHeaders(NULL); и потом заново ставить все три.
 
  • Like
Реакции: Dzen

Dzen

Новичок
MiksIr, точно! Так получается. Спасибо!!)
А по логике, зная что у нас есть объект [__default_headers] с элементами.
Можно наверно дописать в него, не сбрасывая все заголовки __setSoapHeaders(NULL); ?
 

MiksIr

miksir@home:~$
MiksIr, точно! Так получается. Спасибо!!)
Всегда советую читать не только документацию, но и комметарии к ней - там случаются полезные дополнения.
А по логике, зная что у нас есть объект [__default_headers] с элементами.
Можно наверно дописать в него, не сбрасывая все заголовки __setSoapHeaders(NULL); ?
Раз объект не дает ручек по добавлению - значит нельзя. Можно создать тикет-запрос в багтрекере PHP на добавление такой возможности, но с большой вероятностью это будет проигнорировано ;) SoapClient вообще далеко не самый активно развивающийся функционал в PHP.
 
  • Like
Реакции: Dzen
Сверху