我的问题非常基本:每当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
(为简洁起见,排除在外)。这有效,但我有一个主要问题:blackhole()函数中的exit()
。问题是,如果我不在这里退出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()。
答案 0 :(得分:2)
我的建议是重新定位你的黑洞。 这例如是完成的。这里是食谱http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#usage
$this->redirect(array('controller' => 'test', 'action' => 'index'));
重定向将发出退出(http://book.cakephp.org/2.0/en/controllers.html#flow-control)。 如果需要,您还可以在重定向之前向用户发送一些不错的内容:
$this->Session->setFlash('What are you doing!?');
答案 1 :(得分:0)
在你的blackhole回调中你可以抛出一个带有所需消息的异常。这将呈现正确的错误页面并得到记录(假设你已经开启了core.php中的错误记录)。