{ "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'] ); } }
그것은 형식으로 반환과의 인터뷰에서 두 가지 방법을 포함하기 때문에, 반복 컨트롤러가 인스턴스화 트리거, 이것은 일반적으로 일반적인 없습니다. 그래서이 현상은 특정 상황이다. 문제가 발견되었습니다.