我正在使用 Zend 框架开发一个 Web 应用程序。我正在寻找一种智能解决方案,将 RESTful 接口和非 RESTful 接口实现到单个控制器中。
假设我们正在开发一个管理大量纸质杂志信息的 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/。最后,我想要一个支持 JSON 格式的 HEAD/GET/POST/PUT/DELETE 杂志信息的 RESTful 接口,如下图所示。
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 动作这样。
我想知道这种情况的最佳做法。如果通过使用路由器黑客或其他一些解决方案使某些事情变得更好,我想知道如何做到这一点。