2013-04-15 76 views
1

我正在開發一個使用Zend框架的Web應用程序。我正在尋找一個智能解決方案來實現RESTful接口和非RESTful接口到一個控制器。Zend框架控制器包含HTML接口和REST接口

讓我們假裝我們正在開發一個管理一堆紙質雜誌信息的web應用程序。首先,我希望我的網站通過訪問以下路徑顯示所有已註冊的雜誌,格式爲HTML。

GET /magazine/ 

另外,我想一個HTML表單通過

GET /magazine/modify/new 
GET /magazine/modify/3 (HTML form filled with magazine information where ID=3) 

修改新的/現有的雜誌信息並添加|按「提交」按鈕,隱式調用下面的路徑

更新
POST /magazine/modify 

...並重定向到/ magazine /。最後,我想要一個RESTful接口,它支持JSON格式的HEAD/GET/POST/PUT/DELETE雜誌信息,如下所示。

HEAD /magazine/rest 
GET /magazine/rest (All magazine information in list) 
GET /magazine/rest/3 (One single magazine information where ID=3) 
POST /magazine/rest 
PUT /magazine/rest/new 
PUT /magazine/rest/3 
DELETE /magazine/rest/3 

我唯一的想法是在單個控制器類中準備所有動作,該控制器類派生Zend_Controller_Action。

class SlipController extends Zend_Controller_Action{ 
    public function init(){} 

    public function indexAction(){ 
     /* Load all magazine information from model and show. */ 
     $magazine_mapper = new Application_Model_MagazineMapper(); 
     $this->view->magazines = $magazine_mapper->fetchAll(); 
    } 

    public function modifyAction(){ 
     $request = $this->getRequest(); 
     $form = new Application_Form_Magazine(); 
     if($request->isPost()){ 
      if($form->isValid($request->getPost())){ 
       /* Modify magazine information. */ 
       $modified_magazine = new Application_Model_Magazine($form->getValues()); 
       $magazine_mapper = new Application_Model_MagazineMapper(); 
       $magazine_mapper->save($modified_magazine); 
       return $this->_helper->redirector('index'); 
      } 
     }else{ 
      /* Load and prepare form values from Application_Model_Magazine. */ 
     } 
     $this->view->form = $form; 
    } 

    public function restAction(){ 
     switch($this->getRequest()->getMethod()){ 
      case 'HEAD': /* Do for method HEAD */ break; 
      case 'GET': /* Do for method GET */ break; 
      case 'POST': /* Do for method POST */ break; 
      case 'PUT': /* Do for method PUT */ break; 
      case 'DELETE': /* Do for method DELETE */ break; 
     } 
    } 

的問題是,這種解決方案可以讓我實現每一個REST動作。我也聽說過一個名爲Zend_Rest_Controller的良好類,它(我聽說它)使實現RESTful接口更容易,但是這個類似乎與Zend_Rest_Route一起使用,所以我不知道應該在哪裏放置非RESTful操作通過這種方式。

我想知道這種情況的最佳做法。如果通過使用路由器黑客或其他解決方案來獲得更好的效果,我想知道它是如何完成的。

回答

2

爲什麼堅持把所有東西放在同一個控制器中?

GET /magazine/rest/3對我來說似乎相當落後。 URL路徑的範圍應該縮小,即從最小特定到最具體。我會這樣做,而不是GET /rest/magazine/3。這將允許您使用modules,一個用於Web應用程序和一個REST:

/application/modules/app/controllers 
    MagazineController.php 
     indexAction() 
     editAction() 
     newAction() 

/application/modules/rest/controllers 
    MagazineController.php 
     getAction() 
     putAction() 
     postAction() 
     headAction() 
+0

哦,我從來沒有使用'modules'的想法...我會試試看!謝謝!! –

+0

不過,是否可以有一個控制器提供兩者?從我目前瞭解的內容來看,Html和Rest/Http控制器之間的唯一區別是它擴展的基類(我期望Html基本控制器使用視圖來「裝飾」控制器子類返回的ViewModel)。 – Vince

+0

這是他們執行方式的差異,是的。但是他們提供的服務的差異更重要,應該邏輯分離。也就是說,這是可能的,但是如果你把你所有的應用程序的行爲都放到一個巨大的控制器中,那麼你就無法使用MVC設計。 –