如果cakephp3.0中存在内部错误,则强制用户注销

时间:2017-12-13 05:07:06

标签: php cakephp error-handling cakephp-3.0

我正在使用cakephp 3.0,在我的应用程序中,如果发生任何内部错误,我希望强制用户注销或清除会话,我该如何完成它。我可以在错误控制器中进行任何更改,并且能够捕获特定的内部错误。

1 个答案:

答案 0 :(得分:1)

CakePHP使用ErrorController为未处理的异常和致命错误呈现HTTP响应。请注意,它也用于404未找到的例外情况。

您可以在beforeFilter事件中的ErrorController中注销用户,并正常呈现错误消息。之后他们的会议将结束。

我给你一个警告。 ErrorController应尽可能简单。不应该执行沉重的逻辑。原因很简单。如果在AuthComponent内生成致命错误,则会产生无限循环。

大多数人在他们的基础AppController中配置他们的ErrorController,您永远不应该将其扩展为AuthComponent的基类。

这意味着您必须在ErrorController中单独配置AppController,并希望它永远不会失败,并保持配置与try/catch中的配置保持一致。

如果你走那条路。还要将代码包装在ErrorController块中,以防止异常从public function beforeFilter(Event $event) { try { $this->Auth->logout(); }catch(\Exception $ex) { // prevent endless loop } } 内部抛出。

例如;

ErrorController

替代执行302重定向:

最好尽可能保留AuthComponent为香草,而不是在其中加载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' )); } } 。我假设您已经设置了一个控制器,用于登录和退出用户。为该控制器添加一个名为" forced_out"的新路由,然后在存在未捕获的异常时将URL重定向到该路由。在" forced_out"的操作中你可以记录当前用户。

像这样创建一个新的错误处理程序类。

beforeFilter

现在仅在用户登录时注册该错误类。您可以在AppController的{​​{1}}中执行此操作:

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

注意:我不确定CakePHP是否会从错误处理程序中捕获重定向异常。您可能必须使用header(); die()作为最后一次尝试。