CakePHP使用
ErrorController
为未处理的异常和致命错误呈现HTTP响应。请记住,它还用于404 not found异常。
您可以在中注销用户
错误控制器
在
beforeFilter
事件,并将错误消息呈现为正常。之后,他们的会议将结束。
我给你一个警告。这个
错误控制器
应该尽可能简单。不应执行重逻辑。原因很简单。如果在内部生成致命错误
错误控制器
它创造了一个无休止的循环。
大多数人配置他们的
AuthComponent
在他们的基地
AppController
您永远不应该将其扩展为的基类
错误控制器
.
这意味着您必须配置
AuthComponent
在您的
错误控制器
希望它永远不会失败,并且您可以使配置与现有配置保持一致
AppController
.
如果你走那条路。还可以将代码包装在
try/catch
阻止从内部引发异常
错误控制器
.
例如
public function beforeFilter(Event $event)
{
try {
$this->Auth->logout();
}catch(\Exception $ex) {
// prevent endless loop
}
}
或者执行302重定向:
最好保持
错误控制器
尽可能普通,不要加载
AuthComponent
在里面。我假设您已经为用户登录和注销设置了一个控制器。为该控制器添加一个名为“forced\u out”的新路由,然后在出现未捕获的异常时将URL重定向到该路由。在“forced\u 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
这样地:
public function beforeFlter(Event $event) {
if($this->Auth->user()) {
(new ForceOutErrorHandler(Configure::read('Error')))->register()
}
}
注意:我不确定CakePHP是否会像这样从错误处理程序内部捕获重定向异常。您可能需要使用
header(); die()
作为最后一次尝试。