Zend_Rest_Controller没有调用动作

时间:2011-01-27 16:17:32

标签: php api zend-framework rest

我正在使用Zend Framework建立一个网站,它可以作为API调用,也可以在适当的MVC设置中用于在其上构建网站。

我已经设置了一个Zend_rest_route来检查URI并确定要使用的路由。

要调用我们使用的API:

http://api.domain.com/controller/action/id/1

我们称之为

的网站
http://domain.com/controller/action/id/1

我们的想法是,您只需要创建一个包含可用于网站和API的所有操作的控制器,从而最大限度地减少重写代码的需要。

我创建了一个扩展Zend_Rest_Controller的基本控制器,然后由所有Controller扩展,以获得API的基础功能。

我面临的问题是,当我使用API​​调用控制器/操作时,操作不会被调用。

当我var_dump请求对象时,我得到以下内容:

Website - http://domain.com/guestbook/test/id/5 :

...
["_params":protected]=>
  array(4) {
    ["controller"]=>
    string(9) "guestbook"
    ["action"]=>
    string(4) "test"
    ["id"]=>
    string(1) "5"
    ["module"]=>
    string(7) "default"
  }
...

-

API - http://api.domain.com/guestbook/test/id/5 :
...
  ["_params":protected]=>
  array(4) {
    ["controller"]=>
    string(9) "guestbook"
    ["action"]=>
    string(3) "get"
    ["test"]=>
    string(2) "id"
    ["module"]=>
    string(7) "default"
  }
...

网站调用正确的操作“test”,但API调用“get”操作,然后“test”成为第一个参数。

如何让它调用正确的动作?

PHP CODE TO FOLLOW:

Bootlstrap中的路由器:

$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$restRoute = new Zend_Rest_Route($frontController);
$frontController->getRouter()->addRoute('default', $restRoute);

Base Constroller:

abstract class My_Controller_Base extends Zend_Rest_Controller
{

    public function getAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(200);
    }

    public function postAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(201);
    }

    public function putAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(200);
    }

    public function deleteAction()
    {
        $this->getResponse()
             ->setHttpResponseCode(204);
    }

}

最后是我的留言簿管理员:

class GuestbookController extends My_Controller_Base
{
    private $mapper;
    private $model;

    public function init()
    {
       $this->mapper = new Application_Model_GuestbookMapper();
       $this->model = new Application_Model_Guestbook();
    }


    public function indexAction()
    {
        $this->view->entries = $this->mapper->fetchAll();
    }

    public function testAction()
    {
        $test = new Application_Model_Guestbook();
        $id = $this->getRequest()->getParam('id', 1);
        $this->view->entries = $this->mapper->find($id,$test);
        var_dump($this->view->entries);
        $this->_helper->viewRenderer->setNoRender(true);

    }

}

1 个答案:

答案 0 :(得分:0)

我没有使用RESTful服务,但我认为你不能设置一个动作。

Zend_Rest_Route Behavior Method     URI     Module_Controller::action
GET     /product/ratings/   Product_RatingsController::indexAction()
GET     /product/ratings/:id    Product_RatingsController::getAction()
POST    /product/ratings    Product_RatingsController::postAction()
PUT     /product/ratings/:id    Product_RatingsController::putAction()
DELETE  /product/ratings/:id    Product_RatingsController::deleteAction()
POST    /product/ratings/:id?_method=PUT    Product_RatingsController::putAction()
POST    /product/ratings/:id?_method=DELETE     Product_RatingsController::deleteAction()

在Module_Controller之后,只有接下来的两个值将用作键值对,其余值将被截断。这就是为什么你没有在转储中看到param 5的原因。要使用RESTful服务,您需要使用:

http://api.domain.com/guestbook/id/5

如果您需要更深入,请插入模块:

http://api.domain.com/module/controller/id/5