我正在使用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);
}
}
答案 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