Zend _forward()在preDispatch()中不起作用?

时间:2012-06-11 17:46:53

标签: php zend-framework execution-time

我目前正在从我的Zend MVC应用程序构建一个控制器,它只能用作json服务来填充页面。我想限制用户仅使用GET方法来访问此端点(出于某些安全原因)。

我关注了这篇文章_forward() in Zend does not work?,但无法正常工作。

我正在使用preDispatch来检测非get请求,并希望在同一个控制器中转发到errorAction。我的代码看起来像这样,

public function preDispatch(){
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender();
    //Restrict this Controller access to Http GET method
    if(!($this->getRequest()->isGet())){
        return $this->_forward('error');
    }
}

public function errorAction(){
    $this->getResponse()->setHttpResponseCode(501);
    echo "Requested Method is not Implemented";
}

当我使用帖子请求测试页面时,它会抛出

  

PHP致命错误:超过30秒的最长执行时间

我使用了

$this->_redirect("service/error");

想知道这是否是处理这种情况的唯一/最佳方式。

任何帮助都会非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:2)

调用_forward不起作用的原因是因为请求方法没有改变所以你最终会在无限循环中尝试转发error动作,因为请求总是{ {1}}。

POST通过修改在调度请求时将调用的模块,控制器和操作来工作,_forward实际上返回302重定向并导致浏览器发出额外的HTTP请求。 / p>

这两种方法都没问题,但我更倾向于使用_redirect,因为它不需要额外的HTTP请求(但您仍然保证_forward请求被拒绝。

此代码适用于您:

POST