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ます (簡潔にするために除外されています)。これは機能しますが、大きな問題が 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 に指示する方法もあります。

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 に答える