私はcakephp 3.0を使用しています。私のアプリケーションでは、内部エラーが発生した場合に強制的にユーザーログアウトまたはセッションをクリアします。エラーコントローラを変更して、特定の内部エラーをキャッチすることはできますか?cakephp3.0で内部エラーが発生した場合の強制的なユーザーログアウト
答えて
CakePHPは、ErrorController
を使用して、未処理の例外と致命的なエラーの両方に対してHTTP応答を表示します。 404見つからない例外にも使用されていることに注意してください。
beforeFilter
イベントでErrorController
にログアウトし、エラーメッセージを正常に表示できます。その後、彼らのセッションは終了するでしょう。
私はあなたに警告を出します。 ErrorController
はできるだけシンプルに保つ必要があります。重いロジックを実行しないでください。理由は非常に簡単です。 ErrorController
の中で致命的なエラーを生成すると、無限ループが作成されます。
ほとんどの人は、自分のベースにAuthComponent
を設定します。AppController
ErrorController
の基本クラスとしては決して拡張しないでください。
ErrorController
にAuthComponent
を別々に設定して、それが決して失敗しないようにして、設定内容を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'
));
}
}
今ユーザーが署名されているのみで、そのエラーのクラスを登録します。このようなあなたのAppController
のbeforeFilter
でこれを行うことができます。
public function beforeFlter(Event $event) {
if($this->Auth->user()) {
(new ForceOutErrorHandler(Configure::read('Error')))->register()
}
}
注:私はもしわかりませんCakePHPはそのようなエラーハンドラの内部からリダイレクト例外をキャッチします。あなたは最後の試みとして
header(); die()
を使用しなければならないかもしれません。
- 1. エラーが発生した場合に強制終了を防止する
- 2. コック:強制の定義でエラーが発生しました
- 3. 致命的なエラーC1001:コンパイラで内部エラーが発生しました
- 4. basic_timed_mutex.hpp(159):致命的なエラーC1001:コンパイラで内部エラーが発生しました
- 5. 内部エラーが発生しました
- 6. XML-22900:(致命的なエラー)内部エラー状態が発生しました
- 7. エラーが発生した場合は
- 8. エラーが発生した場合(Haskell)
- 9. エラーが発生した場合jboss 5.1.0
- 10. 一時的ではないエラーが発生した場合のMassTransitバイパスリトライポリシー
- 11. プロセスが強制的に強制終了された場合の終了コード
- 12. 内部エラーが発生しました。 [無効なaccess_token、エラーコード43]
- 13. 起動時にスクリプトエラーが発生した場合、Azureノードを強制的にデプロイする
- 14. TFSエラー - TF400898:内部エラーが発生しました
- 15. Jmeterでエラーが発生した場合のスクリプトの再起動
- 16. Handle Socket.io NodeでEADDRINUSEエラーが発生しました。エラーが発生した場合は「OK」です
- 17. C1001:コンパイラで内部エラーが発生しました
- 18. Places APIライブラリで内部エラーが発生しました
- 19. エラーが発生した場合、Qt Creatorでデバッガがクラッシュする
- 20. SafariでJavaScriptエラーが発生した場合は、時々のみ
- 21. Excelでエラーが発生した場合のハンドル
- 22. アンドロイドスタジオでこのエラーが発生した場合
- 23. rootへのアプリケーションリダイレクトでエラーが発生した場合
- 24. ズームとパンニング中に強制的にGoogleマップでエラーが発生する
- 25. 内部結合でMySQLエラー1066が発生するのはなぜですか?
- 26. 整合性エラーが発生した場合の異なる一意制約の区別方法
- 27. CMake:内部CMake変数が必要でないエラーが発生しました
- 28. GAE - !MESSAGE "Deploying ..."の間に内部エラーが発生しました
- 29. RunSpaceの作成時に内部エラーが発生しました
- 30. PythonでNoneTypeエラーが発生した場合If条件
私はすべてのエラーを処理し、すべてのエラーに対してログアウト機能を呼び出すと思います。内部エラー(500シリーズのエラー)のログアウト機能を呼びたい –
エラーコントローラでは、どのタイプのエラーが発生したのかを識別することができます。エラーのタイプに基づいてエラーページを正しく表示しています –
@RosaMystica 'ErrorController'は、アクションを呼び出さずにビューをレンダリングします。ですから、データに到達する唯一の方法は 'beforeRender'イベントです。すべてのデータはコントローラの '$ this-> viewVars'にあります。この '$ code = $ this-> viewVars ['code'];'のようなコードをチェックし、それが500かどうかを調べることができます。 – cgTag