我正在開發一個使用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操作通過這種方式。
我想知道這種情況的最佳做法。如果通過使用路由器黑客或其他解決方案來獲得更好的效果,我想知道它是如何完成的。
哦,我從來沒有使用'modules'的想法...我會試試看!謝謝!! –
不過,是否可以有一個控制器提供兩者?從我目前瞭解的內容來看,Html和Rest/Http控制器之間的唯一區別是它擴展的基類(我期望Html基本控制器使用視圖來「裝飾」控制器子類返回的ViewModel)。 – Vince
這是他們執行方式的差異,是的。但是他們提供的服務的差異更重要,應該邏輯分離。也就是說,這是可能的,但是如果你把你所有的應用程序的行爲都放到一個巨大的控制器中,那麼你就無法使用MVC設計。 –