решение может быть объектно-ориентированным. В следующем коде приведен пример. Помните, что следующий код не является тестом.
class Authentication
{
protected $user;
protected $pw;
public function getUser() : ?string
{
return $this->user;
}
public function setUser(string $user) : Authentication
{
$this->user = $user;
return $this;
}
public function getPw() : string
{
return $this->pw;
}
public function setPw(string $pw) : Authentication
{
$this->pw = $pw;
return $this;
}
}
Показанный выше класс является простой сущностью, которая содержит два свойства $user
fpr имени пользователя и $pw
для пароля. Кроме того, он содержит функции получения и установки для получения или установки значений для двух свойств.
Для следующего шага просто заполните класс данными и сохраните их в SoapVar
объекте.
$authentication = (new Authentication())
->setUser('Username')
->setPw('YourEncodedPassword');
$soapEncodedObject = new \SoapVar(
$authentication,
SOAP_ENC_OBJECT,
null,
null,
'authentication',
'http://www.example.com/namespace'
);
Как вы можете видеть выше, ваш класс аутентификации будет сохранен как объект soap var. Это закодировано как мыльный объект. Единственное, что вам нужно сделать, это установить пространство имен для этого объекта. В приведенном вами примере это ver:
. С этим префиксом пространства имен где-то в вашем файле wsdl отмечается пространство имен. Вы должны найти этот URL-адрес пространства имен и просто заменить пример URL-адреса http://www.example.com/namespace
на правильный URL-адрес, указанный в вашем wsdl.
Следующий шаг - установка этого заголовка в качестве мыла. Это довольно просто.
<code>try {
$client = new SoapClient('http://www.example.com/?wsdl', [
'trace' => true,
'exception' => true,
'cache_wsdl' => WSDL_CACHE_NONE,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
]);
// set the soap header
$header = new SoapHeader('http://www.example.com/namespace', 'authentication', $authentication, false);
$client->setSoapHeaders($header);
// send the request
$result = $client->someWsdlFunction($params);
} catch (SoapFault $e) {
echo "<pre>";
var_dump($e);
echo "
";
if ($ client) {
echo "
";
var_dump($client->__getLastRequest());
echo "
";
echo "
";
var_dump($client->__getLastResponse());
echo "
";
}
}
Как вы можете видеть, это немного отличается от вашего примера. Вместо массива это объект аутентификации, закодированный в soap, который передается классу заголовка soap В целях сбоя вокруг мыльного клиента есть блок try / catch. В этом случае вы можете определить ошибку и, если клиент был инициирован правильно, вы также можете увидеть последний запрос и последний ответ в xml.
Надеюсь, я тебе помог. ;)