Php Zend 1.x中的RESTful路由

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

我是Zend框架的新手,正在尝试在Zend中实现RESTful控制器,并尝试为我的控制器编写单元测试。我遵循的RESTAPI可以在:但是对于每一种测试,PHPUnit总是命中404(通过断言响应代码可以观察到——我期望的代码和PHPUnit接收的代码),因此测试失败

按照REST API的自述说明,我已在各个文件中添加了所有代码:

•我添加了一个特定于REST的模块:/application/modules/api。 •在我的application.ini中,我有以下内容:

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);