Zend_Rest_Serverのhandle()の引数とreturnResponse()メソッド

Zend_Rest_Serverのhandle()メソッドの引数と、returnResponse()メソッドについて、あまり知られていないみたいなので紹介してみる。

Zend_Rest

Zend Frameworkには、Zend_RestというRESTの機能を提供するコンポーネントがある。
その中の、RESTサーバ機能を提供するのが、Zend_Rest_Serverで、簡単にRESTサーバを作れる。

  • クライアントに提供する関数またはクラスを作成
  • Zend_Rest_Serverのインスタンスを生成
  • RESTサーバにアタッチ
  • handle()メソッドを実行

RESTサーバにアタッチというのは、二通りあって、関数をアタッチする方法とクラスをアタッチする方法がある。

  • 関数をアタッチ
<?php
$server = new Zend_Rest_Server();
$server->addFunction('関数名');
  • クラスをアタッチ
<?php
$server = new Zend_Rest_Server();
$server->setClass('クラス名');

具体的には、以下のような感じ。

require_once 'Zend/Rest/Server.php';

class RestServerSample
{
    /**                                                                                    
     * hello                                                                               
     *                                                                                     
     * @param string $name                                                                 
     * @return string                                                                      
     *                                                                                     
     */
    public function hello($name)
    {
        return array('msg' => "Hello, ${name}");
    }
}

$server = new Zend_Rest_Server();
$server->setClass('RestServerSample');
$server->handle();

んで、http://サーバ名/rest_sample.php?method=hello&name=yokkuns にアクセスすると、以下のようなXMLで返ってくる。
ちょっと、自己主張が強くて、generator="zend"とか入るが、気に入らないならソースを直接編集するか、継承とかして書き換えちゃえば良い。

<?xml version="1.0" encoding="UTF-8"?>
<RestServerSample generator="zend" version="1.0">
    <hello>
        <msg>Hello, yokkuns</msg>
        <status>success</status>
    </hello>
</RestServerSample>

handle()の引数とreturnResponse()

しかし、これでは、RESTなのに、GETとかPOSTを区別出来ないし、ローカルでクラス→XMLの変換だけしたい場合などにわざわざ通信しなければならない。また、事前のバリデートも出来ない。

そんな時のために(?)、Zend_Rest_Serverのhandle()メソッドは、引数を渡す事が出来る。

<?php
$server->handle(array('method' => 'hello',  'name' => $name ));

また、デフォルトでは、標準出力されてしまうので、クラス→XMLの変換だけとかの場合には不便。
これは、returnResponse()メソッドで制御してるので、これにtrueを渡す事で文字列として取得出来る。

<?php
$server->returnResponse(true);
$xml = $server->handle(array('method' => 'hello',  'name' => $name ));


普段気にする事もあまり無いかも知れないが、既にフレームワークで動いてるサービスで使いたい場合や、自前のフレームワークで使いたい場合などに知っている良いかも知れない。