我正在使用cakephp 3.0,在我的应用程序中,如果发生任何内部错误,我希望强制用户注销或清除会话,我该如何完成它。我可以在错误控制器中进行任何更改,并且能够捕获特定的内部错误。
答案 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()
作为最后一次尝试。