我的问题是相当基本的:每当 CakePHP 中的某个操作被黑洞时,我想显示一个自定义错误页面;Cake 显示“找不到文件”消息的默认行为使用户(更不用说开发人员)感到困惑。所以我想出了这个,通过搜索文档和 StackOverflow:
class TestsController extends AppController
{
public $components = array ('Security');
public function beforeFilter ()
{
parent::beforeFilter ();
$this->Security->blackHoleCallback = 'blackhole';
$this->Security->csrfExpires = '+5 seconds'; // for testing
}
public function index ()
{
}
public function doit ()
{
$this->log ('Performing request; entry = ' . $this->data['foo'], 'tests');
$this->set ('foo', $this->data['foo']);
}
public function blackhole ($type)
{
$this->log ('Request has been blackholed: ' . $type, 'tests');
$this->render ('/Errors/blackhole');
$this->response->send ();
exit ();
}
}
在 index.ctp 中有一个带有单个文本框的简单表单,用于提交doit
(为简洁起见不包括在内)。这可行,但我有一个主要问题:exit()
在 blackhole() 函数中。问题是,如果我不退出这里doit()
仍然会被调用,即使请求被黑洞,如日志所示:
2013-01-30 15:37:21 Tests: Request has been blackholed: csrf
2013-01-30 15:37:21 Tests: Performing request; entry = kfkfkfkf
这显然不是你所期望的。Cake 文档提示使用(自定义)异常来停止 blackhole() 中的处理,但是:
- 完全超越了使用自定义处理程序的目的;
- 给本来应该很简单的事情又增加了一层复杂性。
我的问题是:是否有适当的方法从 blackhole() 中“退出”,以便 Cake 完成所有渲染/清理/等。它通常会这样做;我已经不得不添加$this->response->send()
强制输出到浏览器。或者,另一种方法是告诉 Cake 在 blackhole() 之后跳过调用 doit()。