Получение имен параметров из запроса SOAP с расширением PHP SOAP?

Учитывая, что следующий client.php создает этот запрос XML:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://soap.dev/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:Test> <RequestId xsi:type="xsd:int">1</RequestId> <PartnerId xsi:type="xsd:int">99</PartnerId> </ns1:Test> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 

Как получить доступ к именам параметров? (RequestId и PartnerId) внутри server.php? Имена явно присутствуют в полезной нагрузке, но на стороне сервера принимаются только значения (1 и 99)

Пример кода:

client.php

 <?php $client_params = array( 'location' => 'http://soap.dev/server.php', 'uri' => 'http://soap.dev/', 'trace' => 1 ); $client = new SoapClient(null, $client_params); try { $res = $client->Test( new SoapParam(1, 'RequestId'), new SoapParam(99, 'PartnerId') ); } catch (Exception $Ex) { print $Ex->getMessage(); } var_dump($client->__getLastRequest()); var_dump($client->__getLastResponse()); 

server.php

 class receiver { public function __call ($name, $params) { $args = func_get_args(); // here $params equals to array(1, 99) // I want the names as well. return var_export($args, 1); } } $server_options = array('uri' => 'http://soap.dev/'); $server = new SoapServer(null, $server_options); $server->setClass('receiver'); $server->handle(); 

Обратите внимание, что я не могу изменить формат входящего запроса.

Кроме того, я знаю, что я могу вернуть имена параметров, создав тестовую функцию с параметрами $RequestId и $PartnerId .

Но я действительно хочу, чтобы получить пары имя / значение из входящего запроса.

Пока единственная идея, которую я имею, – просто проанализировать XML, и это не может быть прав.

Назад, когда у меня возникла эта проблема, я, наконец, решил пойти с идеей прокси-функции – проверить функцию с параметрами с именем ($ RequestId и $ PartnerId), чтобы вернуть имена параметрам. Его адекватное решение, но, конечно, не самое лучшее.

Я еще не потерял надежду на то, что нашел лучшее решение, и вот моя лучшая идея.

 <?php class Receiver { private $data; public function Test () { return var_export($this->data, 1); } public function int ($xml) { // receives the following string // <PartnerId xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xsd:int">99</PartnerId> $element = simplexml_load_string($xml); $this->data[$element->getName()] = (string)$element; } } $Receiver = new Receiver(); $int = array( 'type_name' => 'int' , 'type_ns' => 'http://www.w3.org/2001/XMLSchema' , 'from_xml' => array($Receiver, 'int') ); $server_options = array('uri' => 'http://www.w3.org/2001/XMLSchema', 'typemap' => array($int), 'actor' => 'http://www.w3.org/2001/XMLSchema'); $server = new SoapServer(null, $server_options); $server->setObject($Receiver); $server->handle(); 

Это по-прежнему означает синтаксический анализ XML вручную, но один элемент за раз, что немного более разумно, анализируя все входящее сообщение SOAP.