Php Zend 1.x中的RESTful路由
我是Zend框架的新手,正在尝试在Zend中实现RESTful控制器,并尝试为我的控制器编写单元测试。我遵循的RESTAPI可以在:但是对于每一种测试,PHPUnit总是命中404(通过断言响应代码可以观察到——我期望的代码和PHPUnit接收的代码),因此测试失败 按照REST API的自述说明,我已在各个文件中添加了所有代码: •我添加了一个特定于REST的模块:/application/modules/api。 •在我的application.ini中,我有以下内容:Php Zend 1.x中的RESTful路由,php,rest,zend-framework,phpunit,Php,Rest,Zend Framework,Phpunit,我是Zend框架的新手,正在尝试在Zend中实现RESTful控制器,并尝试为我的控制器编写单元测试。我遵循的RESTAPI可以在:但是对于每一种测试,PHPUnit总是命中404(通过断言响应代码可以观察到——我期望的代码和PHPUnit接收的代码),因此测试失败 按照REST API的自述说明,我已在各个文件中添加了所有代码: •我添加了一个特定于REST的模块:/application/modules/api。 •在我的application.ini中,我有以下内容: autoloader
autoloaderNamespaces[] = "REST_"
rest.default = "xml"
rest.formats[] = "json"
rest.formats[] = "xml"
resources.frontController.plugins.ErrorHandler.class = "Zend_Controller_Plugin_ErrorHandler"
resources.frontController.plugins.ErrorHandler.options.module = "default"
resources.frontController.plugins.ErrorHandler.options.controller = "error"
resources.frontController.plugins.ErrorHandler.options.action = "error"
resources.router.routes.rest.type = Zend_Rest_Route
•在我的应用程序/bootstrap.php中:
public function _initREST()
{
$frontController = Zend_Controller_Front::getInstance();
// set custom request object
$frontController->setRequest(new REST_Request);
$frontController->setResponse(new REST_Response);
$frontController->addModuleDirectory(APPLICATION_PATH . '/modules');
// Add the REST route for the API module only
$restRoute = new Zend_Rest_Route($frontController, array(), array('api'));
$frontController->getRouter()->addRoute('rest', $restRoute);
}
•在my/application/modules/api/Bootstrap.php中:
public function _initREST()
{
$frontController = Zend_Controller_Front::getInstance();
// Register the RestHandler plugin
$frontController->registerPlugin(new REST_Controller_Plugin_RestHandler($frontController));
// Add REST contextSwitch helper
$contextSwitch = new REST_Controller_Action_Helper_ContextSwitch();
Zend_Controller_Action_HelperBroker::addHelper($contextSwitch);
// Add restContexts helper
$restContexts = new REST_Controller_Action_Helper_RestContexts();
Zend_Controller_Action_HelperBroker::addHelper($restContexts);
}
•在我自己的实验中,我还在my/public/index.php中添加了一行$autoloader->registerNamespace('REST'),其中$autoloader表示Zend_Loader_autoloader的一个实例
•我的测试位置:/tests/application/modules/api/controllers/restclastest.php
•这是我对getAction()的测试之一:
•这是我的getAction():
的确,我正在为找不到结果的情况设置404,但具体限制在getAction,它也在用测试来测试可识别的有效ID
我检查了大量的资源(包括这个API提供的示例和Matthew O'Phinney的帖子:),所有这些都指示我遵循我已经在做的事情。很明显,我遗漏了一些他们正在讲述的东西,或者不理解某些因素。如果有人告诉我我做错了什么,我将不胜感激
提前感谢。如果您删除以下内容,是否有效:
$frontController->setRequest(new REST_Request);
在_initRest()。我无法理解API作者为什么会拥有它;任何人都知道,请分享。其次,我认为无论我在测试或代码中做什么,都不会在任何地方得到反映。因此,对Zend的进一步挖掘使我们了解到,对于模块目录中的控制器类,模块名称必须在类名之前,即
类Api\u RestClassController
。现在,至少PHPUnit找到了我的代码类。
public function getAction()
{
$request = $this->getRequest();
$objectId = $request->getParam('id');
// Validation for ID
$this->_validateMongoObjectIdAction($objectId);
// Perform DB record selection
$records = new Db_Collection_Class(new Db_Mongo_Class);
$result = $records->findInCollection(array('_id' => new MongoId($objectId)));
if ($result === null) {
// Source: http://www.w3.org/Protocols/HTTP/HTRESP.html
$this->getResponse()->setHttpResponseCode(404);
}
// Dispatch records in JSON format
$this->_helper->json($result);
}
$frontController->setRequest(new REST_Request);