我正在尝试重新定义Zend(RESTful)中几个控制器的异常处理程序。
这是我的代码:
abstract class RestController extends Zend_Rest_Controller
{
public function init()
{
set_exception_handler(array($this, 'fault'));
}
public function fault($exception = null, $code = null)
{
echo $exception->getMessage();
}
}
但由于某些原因,Zend使用默认模板/错误处理,而我的fault
函数没有执行。
顺便说一下,我正在使用module
架构。该控制器来自rest
模块.Zend的默认错误处理程序来自default
模块。
答案 0 :(得分:4)
这是一个有趣的问题。我现在还不完全确定,所以我要稍微研究一下,看看我想出了什么。目前,有一些解决方案也不是太多的贫民窟。一种方法是创建一个抽象控制器,从中扩展休息模块中的所有控制器。
abstract class RestAbstractController extends Zend_Rest_Controller
{
final public function __call($methodName, $args)
{
throw new MyRestException("Method {$methodName} doesn't exist", 500);
}
}
// the extends part here is optional
class MyRestException extends Zend_Rest_Exception
{
public function fault($exception = null, $code = null)
{
echo $exception->getMessage() . ' ' . __CLASS__;
exit;
}
}
class RestController extends RestAbstractController
{
// method list
}
编辑:
你的bootstrap文件中的某个地方你需要添加:
$this->_front->throwExceptions(true);
$ex = new MyRestException();
set_exception_handler(array($ex, 'fault'));
第一行应该有效地关闭Zend的异常处理,唯一缺少的是用于确定当前请求是否适用于您的REST服务的控制结构。 注意这必须放在Bootstrap.php文件中的原因是你从未在init()函数中调用set_exception_handler(),因为Zend Framework首先抛出异常 。将其置于引导程序文件中将对抗该问题。
答案 1 :(得分:-1)
最后我自己解决了问题:)
在Zend_Controller_Front :: throwExceptions()
通过将布尔值TRUE值传递给此方法,您可以告诉前面 控制器,而不是在响应中聚合异常 对象或使用错误处理程序插件,你宁愿处理它们 自己
所以,正确的解决方案是:
abstract class RestController extends Zend_Rest_Controller
{
public function init()
{
$front = Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
set_exception_handler(array($this, 'fault'));
}
public function fault($exception = null, $code = null)
{
echo $exception->getMessage();
}
}
我们只需要添加
$front = Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
在set_exception_handler
之前使其发挥作用。