2017-12-13 24 views

답변

1

CakePHP는 처리되지 않은 예외와 치명적인 오류 모두에 대해 HTTP 응답을 렌더링하기 위해 ErrorController을 사용합니다. 404 찾을 수없는 예외에도 사용됩니다.

beforeFilter 이벤트에서 ErrorController의 사용자를 로그 아웃하고 정상적으로 오류 메시지를 렌더링 할 수 있습니다. 그 후에 그들의 세션이 끝납니다.

경고를드립니다. ErrorController은 가능한 한 간단하게 보관해야합니다. 무거운 논리를 수행해서는 안됩니다. 이유는 매우 간단합니다. ErrorController 안에 치명적인 오류가 발생하면 무한 루프가 발생합니다.

대부분의 사람들은 자신의베이스 AppControllerAuthComponent을 구성합니다. ErrorController의 기본 클래스로 확장하면 안됩니다.

즉, ErrorControllerAuthComponent을 개별적으로 구성해야하며 절대 실패하지 않고 구성이 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' 
     )); 
    } 
} 

이제 사용자가 로그인 한 경우에만 해당 오류 클래스를 등록 당신이처럼 AppControllerbeforeFilter이 작업을 수행 할 수 있습니다.

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

참고 : 저는 잘 모르겠어요 CakePHP는 에러 핸들러 내부에서 리다이렉트 예외를 잡을 것입니다. 마지막 시도로 header(); die()을 사용해야 할 수도 있습니다.

+0

나는 모든 오류를 처리하고 모든 오류에 대해 로그 아웃 기능을 호출한다고 생각합니다. 내부 오류 (500 시리즈 오류)에 대해서만 로그 아웃 기능을 호출하려고합니다. –

+0

오류 컨트롤러에서는 어떤 유형의 오류가 발생했는지 식별 할 수 있습니다. 오류 유형 –

+0

을 기반으로 오류 페이지를 올바르게 표시하기 때문에 @RosaMystica 'ErrorController'는 동작을 호출하지 않고 뷰를 렌더링합니다. 따라서 데이터를 얻는 유일한 방법은'beforeRender' 이벤트입니다. 모든 데이터는 컨트롤러의'$ this-> viewVars'에 있습니다.이'$ code = $ this-> viewVars [ 'code'];와 같은 코드를 검사하여 500인지 확인하십시오. – cgTag