6

Zend Framework 1.9でのZend_Rest_Routeの導入(および1.9.2 での更新) により、リクエストをルーティングするための標準化された RESTful ソリューションが用意されました。2009 年 8 月現在、その使用例はなく、リファレンス ガイドにある基本的なドキュメントのみです。

おそらく私が想定しているよりもはるかに単純ですが、次のようなシナリオでZend_Rest_Controllerの使用を示すいくつかの例を提供するよりも、有能な人たちを期待していました:

  • 一部のコントローラー (indexController.php など) は正常に動作します
  • その他は REST ベースのサービスとして動作します (json を返します)

JSON アクション ヘルパーは、リクエストに対する json レスポンスを完全に自動化および最適化するようになり、Zend_Rest_Route との併用が理想的な組み合わせになったようです。

4

2 に答える 2

7

かなり単純だったようです。Zend_Rest_Controller Abstract を使用して、Restful Controller テンプレートを作成しました。no_results の戻り値を、返してほしいデータを含むネイティブ php オブジェクトに置き換えるだけです。コメント歓迎。

<?php
/**
 * Restful Controller
 *
 * @copyright Copyright (c) 2009 ? (http://www.?.com)
 */
class RestfulController extends Zend_Rest_Controller
{

    public function init()
    {
        $config = Zend_Registry::get('config');
        $this->db = Zend_Db::factory($config->resources->db);
        $this->no_results = array('status' => 'NO_RESULTS');
    }

    /**
     * List
     *
     * The index action handles index/list requests; it responds with a
     * list of the requested resources.
     * 
     * @return json
     */
    public function indexAction()
    {
        // do some processing...
        // Send the JSON response:
        $this->_helper->json($this->no_results);
    }
    // 1.9.2 fix
    public function listAction() { return $this->_forward('index'); }

    /**
     * View
     *
     * The get action handles GET requests and receives an 'id' parameter; it 
     * responds with the server resource state of the resource identified
     * by the 'id' value.
     * 
     * @param integer $id
     * @return json
     */
    public function getAction()
    {
        $id = $this->_getParam('id', 0);

        // do some processing...
        // Send the JSON response:
        $this->_helper->json($this->no_results);
    }

    /**
     * Create
     *
     * The post action handles POST requests; it accepts and digests a
     * POSTed resource representation and persists the resource state.
     * 
     * @param integer $id
     * @return json
     */
    public function postAction()
    {
        $id = $this->_getParam('id', 0);
        $my = $this->_getAllParams();

        // do some processing...
        // Send the JSON response:
        $this->_helper->json($this->no_results);
    }

    /**
     * Update
     *
     * The put action handles PUT requests and receives an 'id' parameter; it 
     * updates the server resource state of the resource identified by 
     * the 'id' value.
     * 
     * @param integer $id
     * @return json
     */
    public function putAction()
    {
        $id = $this->_getParam('id', 0);
        $my = $this->_getAllParams();

        // do some processing...
        // Send the JSON response:
        $this->_helper->json($this->no_results);
    }

    /**
     * Delete
     *
     * The delete action handles DELETE requests and receives an 'id' 
     * parameter; it updates the server resource state of the resource
     * identified by the 'id' value.
     * 
     * @param integer $id
     * @return json
     */
    public function deleteAction()
    {
        $id = $this->_getParam('id', 0);

        // do some processing...
        // Send the JSON response:
        $this->_helper->json($this->no_results);
    }
}
于 2009-08-27T22:42:49.877 に答える
0

Zend_Rest_Controller素晴らしい投稿ですが、使用されている HTTP メソッドに関して、リクエストを正しいアクションにルーティングすると思っていたでしょう。たとえば、 へのPOSTリクエストhttp://<app URL>/Restfulが自動的_forwardにへになるといいですね。postAction

先に進み、別の戦略を以下に示しますが、背後にあるポイントを見逃している可能性がありZend_Rest_Controllerます...コメントしてください.

私の戦略:

class RestfulController extends Zend_Rest_Controller
{

    public function init()
    {
     $this->_helper->viewRenderer->setNoRender();
  $this->_helper->layout->disableLayout();
    }

    public function indexAction()
    {
        if($this->getRequest()->getMethod() === 'POST')
             {return $this->_forward('post');}

        if($this->getRequest()->getMethod() === 'GET')
             {return $this->_forward('get');}

        if($this->getRequest()->getMethod() === 'PUT')
             {return $this->_forward('put');}

        if($this->getRequest()->getMethod() === 'DELETE')
             {return $this->_forward('delete');}

        $this->_helper->json($listMyCustomObjects);

    }
    // 1.9.2 fix
    public function listAction() { return $this->_forward('index'); }

[the rest of the code with action functions]
于 2009-09-18T17:39:45.140 に答える