zend框架休息控制器问题

时间:2010-10-22 08:36:03

标签: php rest zend-framework zend-app-bootstrap

我有一个休息控制器示例我试图运行,这让我很头疼。

我尝试访问的网址是localhost / books / edit / 1

由于一些奇怪的原因,这条路线似乎用Controller而不是editAction调用getAction。并且它会抛出错误,说该对象不存在。

控制器是,

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' );
    }

}

引导程序是,

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;
    }

}

任何人都可以看到在浏览到该链接时可能导致调用getAction的原因???

1 个答案:

答案 0 :(得分:3)

edit应遵循标识符,因此正确的修改网址为http://localhost/books/1/edit