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