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(为简洁起见不包括在内)。这可行,我有一个主要问题: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()。

4

2 回答 2

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!?');
于 2013-01-30T15:25:09.957 回答
0

在你的黑洞回调中,你可以只抛出一个带有所需消息的异常。这将呈现正确的错误页面并被记录(假设您已打开 core.php 中的错误记录)。

于 2013-01-30T16:09:27.387 回答