2010-10-22 4 views
2

У меня есть пример контроллера rest, который я пытаюсь запустить, что дает мне головную боль.zend frame rest controller question

Мой URL им пытаются получить доступ в локальный/книги/редактировать/1

По какой-то странной причине этот маршрут кажется назвать getAction с контроллером вместо editAction. И он вызывает ошибки, говорящие, что объект не существует.

Контроллер,

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 называться при просмотре этой ссылке ???

ответ

3

edit должен следовать идентификатор, так правильно редактировать URL является http://localhost/books/1/edit

+0

Это где я получил мой пример из, http://avnetlabs.com/zend-framework/restful-controllers-with-zend-framework – nixgadgets

+0

Если вы не можете это сделать, то как я могу использовать пользовательские маршруты? – nixgadgets

+0

После углубления, есть специальная обработка для «нового» и «редактирования» в Zend/Rest/Route.php –