崖っぷちの男

たぶん技術っぽいネタ。ブログ名が決められない

Zend Framework で REST なサービスを作る準備

最近、勉強のために REST っぽいサービスのサンプルを作りたいなと思っています。でもいちからゴリゴリ書くよりフレームワークで何とかしたい、と思ったので PHPZend Framework で REST サービスを作る方法を調べています。まだ調べている段階ですがとりあえず現時点のメモ。


ちなみに ZF のバージョンは 1.11.5 です。

Bootrtrap.php で Zend_Rest_Route を使うよう設定

どこからかコピったソースですが。。

<?php
    protected function _initRoutes()
    {
        $this->bootstrap('frontController');
        $frontController = Zend_Controller_Front::getInstance();
        $restRoute = new Zend_Rest_Route($frontController);
        $frontController->getRouter()->addRoute('default', $restRoute);
    }

コントローラは Zend_Rest_Controller を継承

Zend_Controller_Action の代わりに Zend_Rest_Controller を使います。

注意すべき点は、以下の 5 つのメソッドを定義しないと動かないことです。

  • indexAction()
  • getAction()
  • postAction()
  • putAction()
  • deleteAction()

リクエストの処理関連

XML を POST された場合は、以下でその XML を取得できます。

<?php
$this->getRequest()->getRawBody();


Content-Type(application/x-www-form-urlencoded や application/xml)は以下で取得できます。

<?php
$this->getRequest()->getHeader('Content-Type');

リクエストのテスト - curl

curl で application/x-www-form-urlencoded なデータを送るときは、下のような感じ。

curl -d "foo=bar&hoge=hoge" [サービスの URL]


application/xml の場合は Content-Type で指定しておきます。Windows のコマンドプロンプトではシングルクオートを使うと -H がちゃんと設定されないので注意です。

curl -H "Content-Type: application/xml" -d "<?xml version='1.0'?><doc><item>Some content.</item></doc>" [サービスの URL]


PUT や DELETE ですが、とりあえず 3 つ方法があるっぽいです。

  • -X PUT
  • -d "_method=PUT" (オーバーロードPOST、Ruby on Rails はこれらしい)
  • -H "X-HTTP-Method-Override: PUT" (オーバーロードPOST、GData API はこれらしい)


Zend Framework の REST ライブラリはどれも認識してくれます。


-H "X-HTTP-Method-Override: DELETE" については -d "dummy=dummy" のように何か適当にダミーの値を送っておかないと DELETE と見なされないみたいです。

レスポンス(アクションメソッド内で)

ビューテンプレートの拡張子を変更。

<?php
$this->_helper->viewRenderer->setViewSuffix('xml.php');


viewRenderer を使わない場合。

<?php
$this->_helper->viewRenderer->setNoRender(true);
$this->getResponse()->appendBody("Not found.");


レスポンスコードを設定。

<?php
$this->getResponse()->setHttpResponseCode(409)


ロケーションを返す。

<?php
$this->getResponse()->setHeader("Location", "/user/john");

Eclipse + Xdebugデバッグ

Xdebugデバッグを開始したら、内部 Web ブラウザに "?XDEBUG_SESSION_START=ECLIPSE_DBGP&KEY=xxxxxxxxxxxxxx" みたいなのが出てくるので、 curl で URL を指定するときにこれをコピペして後ろにくっつければデバッグできます。


今日はここまで。まだ色々よく分かりません。
てかはてなの php のシンタックスハイライトって "<?php" がないと色つかないんですね。。