PEAR-SOAPとFlexからの通信(サーバサイド)

PEAR-SOAPを用いて作られたWebServiceFlexからSOAP通信で呼び出したときのメモです。色々とはまりどころがあったのでその際のメモも一緒に。
サンプルつくるにあたっては、サーバ側(PHP)→クライアント側(Flex)の順番で作成しています。

1.サーバ側の準備

サーバ側に必要なのは、実際のSOAP通信の際に受け口になってくるphp(xml.php)で、今回はメソッドなどを外出ししたかったので、クラスにまとめました(Service.php)。
サーバ側のソースなどは以下の通りで、簡単の為にxml.phpとService.phpをサーバのドキュメントルートに設置しています。http://localhost/xml.phpでアクセスできるようにしています。

xml.php
<?php
require_once 'Service.php';
require_once 'SOAP/Server.php';

$server = new SOAP_Server();
$server->addObjectMap(new Service(), "urn:foo"); // ※1

if(isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST')
{
    // $server->service($HTTP_RAW_POST_DATA);
    $server->service(file_get_contents('php://stdin')); // ※2
}
else
{
    require_once 'SOAP/Disco.php';

    $disco = new SOAP_DISCO_Server($server, 'foo');
    header("Content-type: text/xml");

    if(isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'], 'wsdl') == 0)
    {
         echo $disco->getWSDL();
    }
    else
    {
        echo $disco->getDISCO();
    }

    exit;
}
Service.php
<?php
class Service
{
     public function __construct()
     {
         $this->__dispatch_map = array();

         $this->__dispatch_map['hello'] = array(
             'in' => array('arg' => 'string'),
             'out' => array('return' => 'string')
         );
     }

     public function hello($string)
     {
         return $string;
     }
}
WSDLの表示

ここまでつくってhttp://localhost/xml.php?wsdlにアクセスすると以下のようにWSDLが表示されればOK!!!