10

SOAP サーバーを準備し、次のコードを使用して WSDL を生成しています。

//(... Controller action code ...)
if (key_exists('wsdl', $params)) {
    $autodiscover = new AutoDiscover();
    $autodiscover->setClass('WebServiceClass')
                 ->setUri('http://server/webserver/uri');
    $autodiscover->handle();
} else {
    $server = new Server(null);
    $server->setUri($ws_url);
    $server->setObject($this->getServiceLocator()->get('MyController\Service\WebServiceClass'));
    $server->handle();
}

//(... Controller action code ...)

しかし、WebService メソッドの 1 つに、次のように、各要素が「MyOtherClass」型である Array 型のパラメーターがあります。

    /**
     * Add list of MyOtherClass items
     *
     * @param MyOtherClass[]    $items
     *
     * @return bool
     */
    function add($items) {
        // Function code here
    }

WSDL を生成しようとすると、次のエラーが発生します。

PHP Warning:  DOMDocument::loadXML(): Empty string supplied as input in /<zend framweork path>/Server/vendor/zendframework/zendframework/library/Zend/Soap/Server.php on line 734

またはこの例外:

Cannot add a complex type MyOtherClass[] that is not an object or where class could not be found in "DefaultComplexType" strategy.

コードに次のようなものを追加すると、次のようになります。

//(...)
if (key_exists('wsdl', $params)) {

    $autodiscover = new AutoDiscover();
    $autodiscover->setClass('WebServiceClass');
    $autodiscover->setUri($ws_url);

    $complex_type_strategy = new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeComplex();
    $complex_type_strategy->addComplexType('MyOtherClass');
    $autodiscover->setComplexTypeStrategy($complex_type_strategy);
    $autodiscover->handle();
} else {
//(...)

次のエラー メッセージが表示されます。

Fatal error: Call to a member function getTypes() on a non-object in /<project dir>/vendor/zendframework/zendframework/library/Zend/Soap/Wsdl/ComplexTypeStrategy/AbstractComplexTypeStrategy.php on line 54

要約すると、質問は次のとおりです: パラメータとして使用される新しいカスタム タイプの WSDL をどのように認識できますか?

ありがとう

4

2 に答える 2