yii2 응답 시간 출력 문제 찾기

{
     "IsSuccess"1 
    "에 errmsg": "OK", 
    "데이터" {
         "IsSuccess"1 
        "에 errmsg": "OK", 
        "데이터" {
             "IsSuccess"1 
            "에 errmsg": " OK ", 
            "데이터 " {
                 "IsSuccess "1 
                "에 errmsg ":"OK ", 
                "데이터 " {
                     "IsSuccess "1 
                    "에 errmsg ":"OK ", 
                    "데이터 "{
                         "ERROR_CODE": 1, 
                        "메시지": "OK", 
                        "res_msg"{
                             "ERROR_CODE"1 
                            "메시지": "OK", 
                            "res_msg" {
                                 "ERROR_CODE"1 
                                "메시지": "OK", 
                                "res_msg" {
                                     "ERROR_CODE"1 
                                    "메시지": " OK ", 
                                    "res_msg ": {
                                         "ERROR_CODE ": 1, 
                                        "메시지 ":"OK ", 
                                        "res_msg"{
                                             "ERROR_CODE"1 
                                            "메시지": "OK", 
                                            "res_msg" {
                                                 "ERROR_CODE"1 
                                                "메시지": "OK", 
                                                "res_msg" {
                                                     "ERROR_CODE"1 
                                                    "메시지": " OK ", 
                                                    "res_msg "{
                                                         "ERROR_CODE": 1,
                                                        "메시지": "OK", 
                                                        "res_msg" {
                                                             "ERROR_CODE"1 
                                                            "메시지": "OK", 
                                                            "res_msg" {
                                                                 "ERROR_CODE"1 
                                                                "메시지": "OK", 
                                                                "res_msg"{
                                                                     "ERROR_CODE": 1,
                                                                    "메시지": "OK", 
                                                                    "res_msg" {
                                                                         "ERROR_CODE"1 
                                                                        "메시지": "OK", 
                                                                        "res_msg" {
                                                                             "ERROR_CODE"1 
                                                                            "메시지": "OK"
                                                                            "res_msg"{
                                                                                 "ERROR_CODE"1 
                                                                                "메시지": "OK", 
                                                                                "res_msg" {
                                                                                     "ERROR_CODE"1 
                                                                                    "메시지": "OK", 
                                                                                    "res_msg"{
                                                                                         "ERROR_CODE": 1,
                                                                                        "메시지": "OK", 
                                                                                        "res_msg" {
                                                                                             "ERROR_CODE"1 
                                                                                            "메시지": "OK", 
                                                                                            "res_msg" {
                                                                                                 "ERROR_CODE"1
                                                                                                "메시지": "OK", 
                                                                                                "res_msg" {
                                                                                                     "ERROR_CODE"1 
                                                                                                    "메시지": "OK", 
                                                                                                    "res_msg" {
                                                                                                         "ERROR_CODE"1
                                                                                                        "메시지": "OK", 
                                                                                                        "res_msg": {
                                                                                                             "ERROR_CODE": 1, 
                                                                                                            "메시지": "OK", 
                                                                                                            "res_msg"{
                                                                                                                 "ERROR_CODE": 1,
                                                                                                                "메시지": "OK", 
                                                                                                                "res_msg": {
                                                                                                                     "ERROR_CODE": 1, 
                                                                                                                    "메시지": "OK", 
                                                                                                                    "res_msg"{
                                                                                                                         "ERROR_CODE"1 
                                                                                                                        "메시지": "OK", 
                                                                                                                        "res_msg" {
                                                                                                                             "ERROR_CODE"1 
                                                                                                                            "메시지": "OK"
                                                                                                                            "res_msg": "ERROR_CODE": 1,{
                                                                                                                                 "ERROR_CODE": 1, 
                                                                                                                                "메시지": "OK", 
                                                                                                                                "res_msg": {
                                                                                                                                    
                                                                                                                                    "메시지": "OK",
                                                                                                                                    "res_msg": {
                                                                                                                                         "ERROR_CODE": 1, 
                                                                                                                                        "메시지": "OK", 
                                                                                                                                        "res_msg"{
                                                                                                                                             "가능"[
                                                                                                                                                 "/ API / 인증 / 뷰" 
                                                                                                                                            ] , 
                                                                                                                                            "할당" [
                                                                                                                                                 "/ * ",
                                                                                                                                                "/ 관리 / *", 
                                                                                                                                                "/ 관리 / API / *" 
                                                                                                                                            ] 
                                                                                                                                        } 
                                                                                                                                    }
                                                                                                                                } 
                                                                                                                            } 
                                                                                                                        } 
                                                                                                                    } 
                                                                                                                } 
                                                                                                            } 
                                                                                                        } 
                                                                                                    } 
                                                                                                } 
                                                                                            } 
                                                                                        } 
                                                                                    } 
                                                                                } 
                                                                            } 
                                                                        } 
                                                                    } 
                                                                } 
                                                            } 
                                                        } 
                                                    } 
                                                } 
                                            } 
                                        } 
                                    } 
                                } 
                            } 
                        } 
                    } 
                } 
            } 
        } 
    } 
}
코드보기

이러한 현상이다.

동작:

공공 기능 actionRefresh () 
    { 
        $ 모델 = 새 루트 (); 
        $ 모델 ->) (무효; 
        > getRoutes $ 모델 - ()를 호출; 
    }

이 작업에 대한 액세스가 생성됩니다. 이 컨트롤러는 내가 기본 컨트롤러를 작성하는 동료를 상속하기 때문에 다음과 같이 코드는 다음과 같습니다

초기화 기능 공개 () 
    { 
        상위 :: 초기화는 () 
        , beforeSend 이벤트 바인딩 데이터의 출력 형식을 변경 // 
        YII : $ APP->하는 GetResponse () -> (대응 : EVENT_BEFORE_SEND에 [$이 'beforeSend' ]); 
    } 

    / ** 
     * 변경 데이터 출력 형식 
     * 경우 경우 기본 출력 데이터를 JSON 
     파라미터 : \ YII \ 자료 \ $ 이벤트 이벤트 
     * / 
    공공 기능 beforeSend ($ 이벤트) 
    { 
        / * @var 응답 $ \ YII \ 웹 \ 응답 * / 
        $ $으로 응답 = 이벤트 -> SENDER; 
        $ = $ MSG 응답 ->을하는 statusText; 
        $에 statusCode = $ 응답 ->에 statusCode; 
        $ isSuccess = $ 응답 -> getIsSuccessful (); 

        IF (는 isset ($ 응답 -> 데이터 [ '코드']) && $ 응답 ->데이터 [ '코드'] == 0) {
            $ 코드 = 0; 
        } 다른 { 
            경우 ($ isSuccess) { 
                $ 코드 = 1; 
            } 다른 { 
                $ 코드 = 0; 
            } 
        } 
        경우 ($ 응답 ->에 statusCode> = 400) { 
            //异常处理
            경우 (참 && $으로 예외 YII :: = $ APP-> getErrorHandler () -> 예외) { 
                 $ 데이터 = $ 응답 -> 데이터; 
                데이터 = $ this-> convertExceptionToArray ($ 예외) // $; 
            } 
            // 모델出错了
            경우 ($ 응답 -> 상태 코드 == 422) { 
                $ 메시지 = []; 
                foreach는 (V $로서 $ 응답 -> 데이터) {
                    $ 메시지 [] = $의 브이 [ '메시지']; 
                } 
                //请求错误时数据为{ "성공"거짓 "데이터": { "이름", "메시지", "찾을 수 없습니다": "页面未找到.", "코드": 0, "상태" 404}} 
                $ 데이터 = 
                    'ERROR_CODE'=> $ 코드, 
                    '메시지'=> 내파 ( ","$ 메시지) 
                    'res_msg'=> $ 응답 -> 데이터 
                ]; 
            } 
            $ 응답 -> isSent = TRUE; 
          // $ 응답 ->에 statusCode = 200; 
        } 
        ELSEIF ($ 응답 ->에 statusCode> = 300) { 
          // $ 응답 ->
            $ 데이터 = $ this-> convertExceptionToArray (새 ForbiddenHttpException (YII : t ( 'YII', '로그인 필요'))); 
        } 
        다른 { 
            $ 데이터 = $ 응답 -> 데이터; 
        } 

        //请求正确时数据
        $ 응답 -> 데이터 = [ 
            'ERROR_CODE'=> $ 코드, 
            '메시지'=> $ MSG, 
            'res_msg'=> 빈 ($ 데이터)? 어레이 ( '메시지'=> '暂无数据') : $ 데이터 
        ]; 

        $ 응답 -> 형식 = 응답 :: FORMAT_JSON; 
     // \ YII : $ APP->하는 GetResponse () -> 대해 getHeaders () -> 설정 ( '액세스 제어 - 허용 - 기원', '*'); 
      // \ YII : $ APP->하는 GetResponse () -> 대해 getHeaders () -> 설정 ( ' 액세스 제어 - 허용 - 자격 증명 ','진정한 '); 

    }

在 beforeSend 中 YII :: 정보 ($ 응답 ->에 statusCode);

응답 : EVENT_BEFORE_SEND 이벤트가 위의 현상을 주도 여러 번, 트리거 발견.

제어부에 기초하여 상기 이벤트가 여러 제어기의 실행 인스턴스가 반복되기 때문에 결합의 수의 결과 처리기 결합되어 있는지 여부를 검출한다.

다음의 초기화 :

init 함수 공개 () 
    { 
        부모 ::은 init (); 
        // 바인딩 beforeSend 이벤트는, 데이터 출력의 형식을 변경 
        (! YII : $ APP-> 응답 -> hasEventHandlers (응답 : EVENT_BEFORE_SEND가)) {경우 
            // 중복을 피하기 바인딩 
            ([상기이 $ 'beforeSend'] :: 응답 EVENT_BEFORE_SEND)> ON - YII : $ APP->을하는 GetResponse () 
        } 
    }

  방법

그러나 다음과 같이 판정 부가 일부 출력을 누락 후하지만 여섯 개 출력이있다 :

{ 
    "IsSuccess"1 
    "에 errmsg": "OK", 
    "데이터"{ 
        "IsSuccess"1 
        "에 errmsg": "OK", 
        "데이터"{ 
            "IsSuccess"1 
            "에 errmsg": " OK ", 
            "데이터 "{ 
                "IsSuccess "1 
                "에 errmsg ":"OK ", 
                "데이터 "{ 
                    "IsSuccess "1 
                    "에 errmsg ":"OK ", 
                    "데이터 "{ 
                        "ERROR_CODE " 1,
                        "메시지": "OK", 
                        "res_msg": { 
                            "가능"[
                                "/ API / 인증 /보기", 
                                "/ API / 인증 / 생성" 
                            ,] 
                            "할당": 
                                "/ *", 
                                "/ 관리 / *", 
                                "/ 관리 / API / *" 
                            ] 
                        } 
                    } 
                } 
            } 
        } 
    } 
}

출력이 갑자기 앞에 발견

"IsSuccess"1
"에 errmsg": "OK",
"데이터"{}

다음과 같이 그리고 이것은, 내가 결과 포맷을 재생하는 또 다른 기본 컨트롤러에 결합하고있는 이벤트입니다 :

공공 기능을 초기화 () { 
        부모 :: 초기화 (); 
        이벤트 ::에 ( 
            응답 : 클래스 이름 (), 
            응답 :: EVENT_BEFORE_SEND, 
            [$이, 'formatDataBeforeSend'] 
        ); 
    }

아주 이상한, 왜이 함께 혼합?

이러한 상황 모두 취득 방법 getAppRoutes 경로 시스템이므로 그런데되는 컨트롤러의 모든 인스턴스를위한 동작이 수행된다. 여기의 핵심. 

변환에 초기화 방법

공공 기능을 초기화 () { 
        부모 :: 초기화 (); 
        만약 (! 이벤트 :: hasHandlers (응답 : 클래스 이름 (), 응답 :: EVENT_BEFORE_SEND)) { 
            이벤트 ::에 ( 
                응답 : 클래스 이름 (), 
                응답 :: EVENT_BEFORE_SEND, 
                [$이, 'formatDataBeforeSend'] 
            ); 
        } 
    }

다음과 같이 그러나,이 치료 후, 문제점이있다 :

{ 
    "IsSuccess"1 
    "에 errmsg": "OK", 
    "데이터"{ 
        "ERROR_CODE"1 
        "메시지": "OK", 
        "res_msg"{ 
            "가능": 
                "/ API / 인증 / 뷰 ", 
                "/ API / 인증 / "생성 
                "/ API / 인증 / 업데이트 " 
            , 
            "할당을 ": 
                "/ * ", 
                "/ 관리 / * " 
            ] 
        } 
    } 
}

이 문제가 있지만 문제의 원인이 여기에 해당하기 때문에 문제를 일으키는 일반 트리거와 결합 경로 컨트롤러로 구속 트리거하는 이벤트,의.

다음과 같이 선행 결정보다는이 문제에 더하여, 우리는 그것을 처리했다 :

공공 기능을 초기화 () { 
        부모 :: 초기화 (); 
        만약 ( 
            ! 이벤트 :: hasHandlers (응답 : 클래스 이름 (), 응답 :: EVENT_BEFORE_SEND) 
            &&! YII : $ APP-> 응답 -> hasEventHandlers (응답 : EVENT_BEFORE_SEND) 
        ) { 
            (의 이벤트 :: 
                응답 : 클래스 이름 () 
                응답 :: EVENT_BEFORE_SEND, 
                [$이 'formatDataBeforeSend'] 
            ); 
        } 
    }

그것은 형식으로 반환과의 인터뷰에서 두 가지 방법을 포함하기 때문에, 반복 컨트롤러가 인스턴스화 트리거, 이것은 일반적으로 일반적인 없습니다. 그래서이 현상은 특정 상황이다. 문제가 발견되었습니다.

추천

출처www.cnblogs.com/jiangtian/p/10991576.html