如何正确退出自定义黑洞处理程序?

时间:2013-01-30 15:08:13

标签: cakephp cakephp-2.0

我的问题非常基本:每当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()。

2 个答案:

答案 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中的错误记录)。