Добавление атрибутов к фактическому тегу функции в PHP soapCall

Мне нужно добавить атрибуты к тегу, представляющему функцию/метод при вызове мыльного интерфейса (в частности, интерфейса zimbra).

Я понимаю, как атрибуты добавляются к тегам parameter, но не к фактическому тегу метода.

Например, чтобы добавить их к параметрам, можно сделать что-то вроде:

    $var = new SoapVar('<account by="name">' . $account . '</account>', XSD_ANYXML);
    $params = array(new SoapParam($var, 'account'));

    try {
        $result = $this->SoapClient->__soapCall(
            "GetAccountInfoRequest", $params, null, $header
        );
    } catch (SoapFault $fault) {
        return false;
    } 

Что сгенерирует следующий ожидаемый XML:

<body>
    <GetAccountInfoRequest>
        <account by="name">*someAccountName*</account>
    </GetAccountInfoRequest>
</body>

Но что происходит, когда нужно добавить атрибуты к фактическому тегу метода, например, в Zimbra setPasswordRequest.

Этот запрос ожидает XML, мало чем отличающийся от следующего:

<body>
    <SetPasswordRequest id="someAccountId" newPassword="s3cr3tP@ss" />
</body>

Это просто тег, представляющий метод с атрибутами и 0 параметрами.

Я пробовал следующее (безрезультатно):

    $var = new SoapVar('<SetPasswordRequest id="'.$accountInfo->id
        .' newPassword="'.$newPass.'"/>', XSD_ANYXML);
    $params = array(new SoapParam($var, 'SetPasswordRequest'));

    try {
        $result = $this->SoapClient->__soapCall(
            "SetPasswordRequest", $params, null, $header
        );
    } catch (SoapFault $fault) {
        return false;
    }

Который, к моему большому огорчению, создал вложенный тег, подобный следующему:

<body>
    <ns1:SetPasswordRequest>
        <SetPasswordRequest id="5329ee70-fb5b-4fa1-a6cb-4c5a3f7f8a91 newPassword="DpJsPX3w?"/>
    </ns1:SetPasswordRequest>
</body>

В настоящее время я сериализую XML-код мыла вручную для таких запросов и отправляю его с помощью curl, но должен быть способ сделать это с помощью SoapClient, я беспокоюсь о читаемости кода и переносимости для будущих разработчиков, я не не хочу, чтобы кто-то научился использовать мою собственную итерацию сериализатора SOAP только для того, чтобы иметь возможность отправлять запросы.


person jesse_galley    schedule 18.03.2013    source источник
comment
Привет, у меня такая же проблема, ты нашел решение? Спасибо   -  person Vincent    schedule 02.06.2015
comment
@ Винсент, к сожалению, нет, я просто продолжал сериализовать мыло вручную для той части, которая требовала этого.   -  person jesse_galley    schedule 08.06.2015
comment
Большое спасибо, что нашли время ответить, в итоге я тоже использовал то же решение (не очень чистое, но, по крайней мере, оно работает).   -  person Vincent    schedule 09.06.2015


Ответы (1)


Похоже, в приведенном выше коде отсутствует закрывающая двойная кавычка.

$var = new SoapVar('<SetPasswordRequest id="'.$accountInfo->id
        .'" newPassword="'.$newPass.'"/>', XSD_ANYXML);
    $params = array(new SoapParam($var, 'SetPasswordRequest'));

Также ссылайтесь на этот пост для альтернативного подхода. Атрибут объекта PHP SoapVar?

person stikman    schedule 11.07.2015