Ошибка SOAP-сервера в PHP - добавление функций из класса - PullRequest
2 голосов
/ 10 февраля 2010

Я пишу SOAP-сервер и столкнулся со странной проблемой.

Вот соответствующие строки из server.php

class MyHandler {
    public function __construct() { ... }
    public function __wakeup() { ... }

    public function getPrice() { ... }
}

$server = new SoapServer("my.wsdl", array("soap_version" => SOAP_1_2));

$server->setClass('MyHandler');
$server->addFunction("getPrice");
$server->handle();

Локальное тестирование (на PHP 5.3) работает нормально, и я могу отправлять запросы и получать ответы.

Когда я помещаю это на свой сервер разработки (PHP 5.2.9), я получаю это сообщение об ошибке:

SoapServer::addFunction(): Tried to add a non existant function 'getPrice'

Помимо того, что они не могут произносить по буквам, это очень запутанно.

С тех пор мне удалось обойти эту проблему, изменив строку addFunction() на эту:

$server->addFunction(SOAP_FUNCTIONS_ALL);

... и работает нормально! Конечно, изучение $server->getFunctions() показывает, что здесь добавляются функции __construct() и __wakeup() из моего класса, что не очень хорошая вещь.

Что я сделал не так? Подходит ли ковровая бомба «добавить все функции» к единственному пути?

Ответы [ 4 ]

5 голосов
/ 10 февраля 2010

Использование addFunction() говорит ему искать функцию с именем getPrice() самостоятельно, вне класса. Это не существует, поэтому вызывает ошибку.

Использование addClass() автоматически добавит все функции из MyHandler, поэтому вам не нужно вызывать addFunction(), getPrice() уже должно быть добавлено.

Кроме того, на bugs.php.net есть открытый тикет (для PHP 5.2.9), который, кажется, указывает на то, что нет способа добавить метод класса, используя addFunction(): http://bugs.php.net/bug.php?id=47919

У меня нет доступа к PHP 5.3, поэтому я не уверен, как все могло измениться, боюсь ...

2 голосов
/ 27 июня 2013

$server->addFunction(array("SOAPMethods", "getPrice"));

0 голосов
/ 05 декабря 2016

Я использую PHP версии 5.3.10, и у меня была такая же проблема.И я решил это, добавив ключевое слово array.

До:

 $server->addFunction("functionName");

После:

 $server->addFunction(array("functionName"));

Ссылка: PHP SoapServer :: addFunction Документация.

0 голосов
/ 10 февраля 2010

Хм, не уверен, почему он работает на PHP 5.3, но насколько я понимаю, SoapServer::setClass() экспортирует все методы в данном классе (т. Е. Ваш getPrice() метод будет экспортирован с использованием этого).

SoapServer::addFunction() работает специально с функциями скважины. Был ли у вас случайный случай с функцией getPrice() в вашей локальной среде?

Вы можете проверить это, закомментировав вызов addFunction(), который все равно должен показывать ваши экспортированные методы из "MyHandler".

Использование SOAP_FUNCTIONS_ALL , вероятно, плохая идея, так как если вы удалите вызов setClass(), он по какой-то причине экспортирует все функции PHP ...

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