私の問題はかなり基本的なものです。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
ます (簡潔にするために除外されています)。これは機能しますが、大きな問題が 1 つあり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() での処理を停止することを示唆していますが、それは次のとおりです。
- カスタムハンドラーを使用する目的を完全に打ち負かします。
- シンプルであるべきものに複雑さの別のレイヤーを追加します。
私の質問は次のとおりです: Cake がすべてのレンダリング/クリーンアップなどを行うように、blackhole() から「終了」する適切な方法はありますか? 通常はそうです。$this->response->send()
ブラウザへの出力を強制するために、すでに追加する必要がありました。あるいは、blackhole() の後で doit() の呼び出しをスキップするよう Cake に指示する方法もあります。