2017-12-13 10 views

答えて

1

CakePHPは、ErrorControllerを使用して、未処理の例外と致命的なエラーの両方に対してHTTP応答を表示します。 404見つからない例外にも使用されていることに注意してください。

beforeFilterイベントでErrorControllerにログアウトし、エラーメッセージを正常に表示できます。その後、彼らのセッションは終了するでしょう。

私はあなたに警告を出します。 ErrorControllerはできるだけシンプルに保つ必要があります。重いロジックを実行しないでください。理由は非常に簡単です。 ErrorControllerの中で致命的なエラーを生成すると、無限ループが作成されます。

ほとんどの人は、自分のベースにAuthComponentを設定します。AppControllerErrorControllerの基本クラスとしては決して拡張しないでください。

ErrorControllerAuthComponentを別々に設定して、それが決して失敗しないようにして、設定内容をAppControllerと一致させておくことを願います。

もしあなたがそのルートに行くなら。また、try/catchブロックにコードをラップして、ErrorControllerの内部から例外がスローされないようにします。

たとえば、それは可能な限りバニラとしてErrorControllerを維持し、その中AuthComponentをロードしない方が良いでしょう

public function beforeFilter(Event $event) 
{ 
    try { 
     $this->Auth->logout(); 
    }catch(\Exception $ex) { 
     // prevent endless loop 
    } 
} 

代替は302リダイレクトを行います。私は、ユーザーのログインとログアウトのために既にコントローラーが設定されていると仮定します。 "forced_out"というコントローラの新しいルートを追加し、キャッチされない例外がある場合は、そのルートにURLをリダイレクトします。 "forced_out"のアクション内で、現在のユーザーをログアウトすることができます。

このような新しいエラーハンドラクラスを作成します。

class ForceOutErrorHandler extends ErrorHandler { 
    protected function _displayException($exception) 
    { 
     // restore the old handler 
     (new ErrorHandler(Configure::read('Error')))->register(); 

     throw new RedirectException(Router::url([ 
      'controller'=>'Users', 
      'action'=>'forced_out' 
     )); 
    } 
} 

今ユーザーが署名されているのみで、そのエラーのクラスを登録します。このようなあなたのAppControllerbeforeFilterでこれを行うことができます。

public function beforeFlter(Event $event) { 
    if($this->Auth->user()) { 
     (new ForceOutErrorHandler(Configure::read('Error')))->register() 
    } 
} 

注:私はもしわかりませんCakePHPはそのようなエラーハンドラの内部からリダイレクト例外をキャッチします。あなたは最後の試みとしてheader(); die()を使用しなければならないかもしれません。

+0

私はすべてのエラーを処理し、すべてのエラーに対してログアウト機能を呼び出すと思います。内部エラー(500シリーズのエラー)のログアウト機能を呼びたい –

+0

エラーコントローラでは、どのタイプのエラーが発生したのかを識別することができます。エラーのタイプに基づいてエラーページを正しく表示しています –

+0

@RosaMystica 'ErrorController'は、アクションを呼び出さずにビューをレンダリングします。ですから、データに到達する唯一の方法は 'beforeRender'イベントです。すべてのデータはコントローラの '$ this-> viewVars'にあります。この '$ code = $ this-> viewVars ['code'];'のようなコードをチェックし、それが500かどうかを調べることができます。 – cgTag

関連する問題