cakephp 3.0을 사용하고 있습니다. 내 응용 프로그램에서 내부 오류가 발생하면 강제로 사용자 로그 아웃하거나 세션을 정리하고 싶습니다. 어떻게 할 수 있습니까? 오류 컨트롤러를 변경하고 특정 내부 오류를 포착 할 수 있습니까?cakephp3.0에서 내부 오류가 발생할 경우 강제로 사용자 로그 아웃
답변
CakePHP는 처리되지 않은 예외와 치명적인 오류 모두에 대해 HTTP 응답을 렌더링하기 위해 ErrorController
을 사용합니다. 404 찾을 수없는 예외에도 사용됩니다.
beforeFilter
이벤트에서 ErrorController
의 사용자를 로그 아웃하고 정상적으로 오류 메시지를 렌더링 할 수 있습니다. 그 후에 그들의 세션이 끝납니다.
경고를드립니다. ErrorController
은 가능한 한 간단하게 보관해야합니다. 무거운 논리를 수행해서는 안됩니다. 이유는 매우 간단합니다. ErrorController
안에 치명적인 오류가 발생하면 무한 루프가 발생합니다.
대부분의 사람들은 자신의베이스 AppController
에 AuthComponent
을 구성합니다. ErrorController
의 기본 클래스로 확장하면 안됩니다.
즉, ErrorController
에 AuthComponent
을 개별적으로 구성해야하며 절대 실패하지 않고 구성이 AppController
에 맞게 유지되기를 바랍니다.
그 경로를 선택하십시오. ErrorController
내부에서 예외가 발생하지 않도록 try/catch
블록에 코드를 래핑하십시오.
예 : 그것은 가능한 한 바닐라로 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()
을 사용해야 할 수도 있습니다.
나는 모든 오류를 처리하고 모든 오류에 대해 로그 아웃 기능을 호출한다고 생각합니다. 내부 오류 (500 시리즈 오류)에 대해서만 로그 아웃 기능을 호출하려고합니다. –
오류 컨트롤러에서는 어떤 유형의 오류가 발생했는지 식별 할 수 있습니다. 오류 유형 –
을 기반으로 오류 페이지를 올바르게 표시하기 때문에 @RosaMystica 'ErrorController'는 동작을 호출하지 않고 뷰를 렌더링합니다. 따라서 데이터를 얻는 유일한 방법은'beforeRender' 이벤트입니다. 모든 데이터는 컨트롤러의'$ this-> viewVars'에 있습니다.이'$ code = $ this-> viewVars [ 'code'];와 같은 코드를 검사하여 500인지 확인하십시오. – cgTag