我正在使用 cakephp 3.0,在我的应用程序中,如果发生任何内部错误,我希望强制用户注销或清除 session ,我该如何完成它。我可以在错误 Controller 中进行任何更改,它是否能够捕获特定的内部错误。
最佳答案
CakePHP 使用 ErrorController
为未处理的异常和 fatal error 呈现 HTTP 响应。请记住,它也用于 404 not found 异常。
您可以在 ErrorController
中注销用户在 beforeFilter
事件,并正常呈现错误消息。之后,他们的 session 将结束。
我给你一个警告。 ErrorController
应尽可能简单。不应执行繁重的逻辑。原因很简单。如果您在 ErrorController
内部生成 fatal error 它创建了一个无限循环。
大多数人配置他们的AuthComponent
在他们的基地AppController
你不应该将其扩展为 ErrorController
的基类.
这意味着您必须配置 AuthComponent
分别在您的ErrorController
并希望它永远不会失败,并且您保持配置与 AppController
中的配置一致.
如果你走那条路。还将您的代码包装在 try/catch
中阻止从 ErrorController
内部抛出异常.
例如;
public function beforeFilter(Event $event)
{
try {
$this->Auth->logout();
}catch(\Exception $ex) {
// prevent endless loop
}
}
替代执行 302 重定向:
最好保留
ErrorController
尽可能 Vanilla 而不加载AuthComponent
在里面。我假设您已经设置了一个用于登录和注销用户的 Controller 。为该 Controller 添加一个名为“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'
));
}
}
现在仅在用户登录时注册该错误类。您可以在
beforeFilter
中执行此操作。您的AppController
像这样:public function beforeFlter(Event $event) {
if($this->Auth->user()) {
(new ForceOutErrorHandler(Configure::read('Error')))->register()
}
}
Note: I'm not sure if CakePHP will catch the redirect exception from inside the error handler like that or not. You might have to use
header(); die()
as a last try.
关于php - 在 cakephp3.0 内部错误的情况下强制用户注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785849/