views:

24

answers:

1

Hi guys,

I have a rest controller example im trying to run that is giving me a headache.

My url im trying to access is localhost/books/edit/1

For some weird reason this route seems to call the getAction with the Controller instead of the editAction. And it throws errors saying that the object doesnt exist.

The controller is,

class BooksController extends Zend_Rest_Controller {

    private $_booksTable;
    private $_form;

    public function init() {
        $bootstrap = $this->getInvokeArg ( 'bootstrap' );
        $db = $bootstrap->getResource ( 'db' );

        $options = $bootstrap->getOption ( 'resources' );
        $dbFile = $options ['db'] ['params'] ['dbname'];
        if (! file_exists ( $dbFile )) {
            $createTable = "CREATE TABLE IF NOT EXISTS books (
                        id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                        name VARCHAR(32) NOT NULL,
                        price DECIMAL(5,2) NOT NULL
                    )";
            $db->query ( $createTable );

            $insert1 = "INSERT INTO books (name, price) VALUES ('jQuery in Action', 39.99)";
            $insert2 = "INSERT INTO books (name, price) VALUES ('PHP in Action', 45.99)";
            $db->query ( $insert1 );
            $db->query ( $insert2 );
        }

        $this->_booksTable = new Zend_Db_Table ( 'books' );
        $this->_form = new Default_Form_Book ();
    }

    /**
     * The index action handles index/list requests; it should respond with a
     * list of the requested resources.
     */
    public function indexAction() {
        $this->view->books = $this->_booksTable->fetchAll ();
    }

    /**
     * The list action is the default for the rest controller
     * Forward to index
     */
    public function listAction() {
        $this->_forward ( 'index' );
    }

    /**
     * The get action handles GET requests and receives an 'id' parameter; it 
     * should respond with the server resource state of the resource identified
     * by the 'id' value.
     */
    public function getAction() {
        $this->view->book = $this->_booksTable->find ( $this->_getParam ( 'id' ) )->current ();
    }

    /**
     * Show the new book form
     */
    public function newAction() {
        $this->view->form = $this->_form;
    }

    /**
     * The post action handles POST requests; it should accept and digest a
     * POSTed resource representation and persist the resource state.
     */
    public function postAction() {
        if ($this->_form->isValid ( $this->_request->getParams () )) {
            $this->_booksTable->createRow ( $this->_form->getValues () )->save ();
            $this->_redirect ( 'books' );
        } else {
            $this->view->form = $this->_form;
            $this->render ( 'new' );
        }
    }

    /**
     * Show the edit book form. Url format: /books/edit/2
     */
    public function editAction() {
        var_dump ($this->getRequest()->getParam ( 'edit' ));
        $book = $this->_booksTable->find ( $this->getRequest()->getParam ( 'id' ) )->current ();
        var_dump ($book->toArray ());
        $this->_form->populate ( $book->toArray () );
        $this->view->form = $this->_form;
        $this->view->book = $book;
    }

    /**
     * The put action handles PUT requests and receives an 'id' parameter; it 
     * should update the server resource state of the resource identified by 
     * the 'id' value.
     */
    public function putAction() {
        $book = $this->_booksTable->find ( $this->_getParam ( 'id' ) )->current ();
        if ($this->_form->isValid ( $this->_request->getParams () )) {
            $book->setFromArray ( $this->_form->getValues () )->save ();
            $this->_redirect ( 'books' );
        } else {
            $this->view->book = $book;
            $this->view->form = $this->_form;
            $this->render ( 'edit' );
        }
    }

    /**
     * The delete action handles DELETE requests and receives an 'id' 
     * parameter; it should update the server resource state of the resource
     * identified by the 'id' value.
     */
    public function deleteAction() {
        $book = $this->_booksTable->find ( $this->_getParam ( 'id' ) )->current ();
        $book->delete ();
        $this->_redirect ( 'books' );
    }

}

The bootstrap is,

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
    protected function _initAutoload() {
        $autoloader = new Zend_Application_Module_Autoloader ( array (
            'namespace' => 'Default_', 
            'basePath' => dirname ( __FILE__ ) 
        ) );
        return $autoloader;
    }

    protected function _initRestRoute() {
        $this->bootstrap ( 'Request' );
        $front = $this->getResource ( 'FrontController' );
        $restRoute = new Zend_Rest_Route ( $front, array (), array (
            'default' => array ('books' ) 
        ) );
        $front->getRouter ()->addRoute ( 'rest', $restRoute );
    }

    protected function _initRequest() {
        $this->bootstrap ( 'FrontController' );
        $front = $this->getResource ( 'FrontController' );
        $request = $front->getRequest ();
        if (null === $front->getRequest ()) {
            $request = new Zend_Controller_Request_Http ();
            $front->setRequest ( $request );
        }
        return $request;
    }

}

Can anyone see what might be causing the getAction to be called when browsing to that link ???

+2  A: 

edit should follow the identifier, so the correct edit URL is http://localhost/books/1/edit

divideandconquer.se
This is where I got my example from, http://avnetlabs.com/zend-framework/restful-controllers-with-zend-framework
kuzyt
If you cant do that then how can I possibly use custom routes ??
kuzyt
After digging deeper, there is special handling for "new" and "edit" in Zend/Rest/Route.php
divideandconquer.se
Maybe you have the wrong URL. Please try http://localhost/books/1/edit
divideandconquer.se
you the man. that was definitely the problem.....
kuzyt
Good, I have updated the answer accordingly.
divideandconquer.se