1

我正在使用 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 动作这样。

我想知道这种情况的最佳做法。如果通过使用路由器黑客或其他一些解决方案使某些事情变得更好,我想知道如何做到这一点。

4

1 回答 1

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()
于 2013-04-15T15:03:08.433 回答