Zend Framework 1.9.2+ Zend_Rest_Route Examples
Asked Answered
A

2

6

With the introduction of Zend_Rest_Route in Zend Framework 1.9 (and its update in 1.9.2) we now have a standardized RESTful solution for routing requests. As of August 2009 there are no examples of its usage, only the basic documentation found in the reference guide.

While it is perhaps far more simple than I assume, I was hoping those more competent than I might provide some examples illustrating the use of the Zend_Rest_Controller in a scenario where:

  • Some controllers (such as indexController.php) operate normally
  • Others operate as rest-based services (returning json)

It appears the JSON Action Helper now fully automates and optimizes the json response to a request, making its use along with Zend_Rest_Route an ideal combination.

Amadaamadas answered 27/8, 2009 at 21:3 Comment(0)
A
7

Appears it was rather simple. I've put together a Restful Controller template using the Zend_Rest_Controller Abstract. Simply replace the no_results return values with a native php object containing the data you want returned. Comments welcome.

<?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);
    }
}
Amadaamadas answered 27/8, 2009 at 22:42 Comment(2)
Ends up the fix didn't make it in 1.9.2, you need to forward a listAction to index (updated above).Amadaamadas
Appears to be slated for 1.9.3 (search for 'rest' in page text here:) framework.zend.com/issues/browse/ZF/fixforversion/10360Amadaamadas
H
0

great post, but I would have thought the Zend_Rest_Controller would route the request to the right action with respect to the HTTP method used. It'd be neat if a POST request to http://<app URL>/Restful would automatically _forward to postAction for example.

I'll go ahead and provide another strategy below, but maybe I'm missing the point behind Zend_Rest_Controller ... please comment.

My strategy:

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]
Head answered 18/9, 2009 at 17:39 Comment(3)
Hi again, not looking to score an answer on stackoverflow here ;0) I thought posting an answer was the only way to comment on your post above. Mind you my code pane above looks bitchin' in the answer format ;0)Head
Thanks man :) Is funny, after implementing all this we ended up going back to a less-restful model. Just noticed a post from Zend's project lead on best practices, posted here as well for others.Amadaamadas
Zend_Rest_Controller does all of this automatically. The part you are missing is initializing the REST routes.Dygall

© 2022 - 2024 — McMap. All rights reserved.