{ "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、 "メッセージ": "OK"、 "res_msg":{ "ERROR_CODE":1、 "メッセージ": "OK"、 "res_msg":{ "ERROR_CODE":1、 "メッセージ": "OK"、 "res_msg":{ "利用可能":[ "/ API / AUTH /ビュー" ]、 "割り当て":[ "/ *」、 "/管理/ *"、 } "/管理/ API / *" ] } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }
これらの現象です。
アクション:
パブリック関数actionRefresh() { $モデル=新ルート(); $モデル- >無効化(); $モデル- > getRoutesを返します(); }
このアクションへのアクセスが発生しました。このコントローラは、私はベースコントローラを書き込むための同僚を継承しているので、次のように、コードは次のとおりです。
init関数のパブリック() { 親::のinit(); //はbeforeSendイベントをバインドし、データ出力フォーマット変更 のYiiを:: $ APP->てgetResponse() - >(レスポンス:: EVENT_BEFORE_SEND、[$この、上の'beforeSend' ]); } / ** *変更データ出力フォーマット *デフォルト出力データJSONケース * @param \のYii \ベース\ $イベントイベント * / パブリック関数beforeSend($イベント) { / * @var応答$ \のYii \ウェブ\レスポンス* / $の$レスポンス= event-> SENDER; $ = $ MSG対応- > STATUSTEXT; $からstatusCode = $対応- >からstatusCode; $ isSuccess = $対応- > getIsSuccessful(); IF(ISSET($対応- >データ[ 'コード'])&& $対応- >データ[ 'コード'] == 0){ $コード= 0; }他{ IF($ isSuccess){ $コード= 1。 }他{ $コード= 0。 } } ($対応- >からstatusCode> = 400){もし //异常处理 場合(真&& $例外=のYii :: $ APP-> getErrorHandler() - >例外){ $データ= $対応- >データ。 // $データ=の$ this - > convertExceptionToArray($例外)。 } //モデル出错了 IF($対応- >からstatusCodeの== 422){ $メッセージ= []; foreachの($対応- >データ$ Vなど){ $メッセージ[] = $のV [ 'メッセージ']; } //请求错误时数据为{ "成功":偽、 "データ":{ "名": "Not Found"や"メッセージ": "页面未找到"、 "コード":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() - >セット(」Access-Control-Allow-Credentials'、 '真'); }
在beforeSend中のYii ::情報($対応 - >からstatusCode);
レスポンス:: EVENT_BEFORE_SENDは、上記の現象につながった、イベントが複数回トリガーされることが判明しました。
コントローラに基づいてイベントは、複数のコントローラの実行がインスタンス化されるので、繰り返し結合の数で、その結果、ハンドラに結合されていないかどうかを検出します。
以下でのinit:
init関数のパブリック() { 親::のinit(); //バインドbeforeSendイベントは、データ出力のフォーマットを変更 {(!のYii :: $ APP->対応- > hasEventHandlers(レスポンス:: EVENT_BEFORE_SEND))のIF //重複を避けます結合 ;(応答:: EVENT_BEFORE_SEND、[この$、 'beforeSend'])ON> -のYii :: $ APP->てgetResponseを() } }
方法
次のようにしかし、いくつかの出力が不足し、決意を添加した後、しかし、6つの出力があります。
{ "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 / AUTH /ビュー"、 "/ API / AUTH /作成" ]、 "割り当てられた" [ "/ *"、 "/管理/ *"、 "/管理/ API / *" ] } } } } } } }
突然、出力の前にあるが見つかりました:
"IsSuccess":1、
"のErrMsg": "OK"、
"データ":{}
そして、これは次のように私は、結果フォーマットを再生するには、別のベースコントローラにバインドされていたイベントです。
パブリック関数init(){ 親::のinit(); (上のイベント:: 応答::クラス名()、 応答:: EVENT_BEFORE_SEND、 [$この、 'formatDataBeforeSend'] ); }
非常に奇妙な、なぜ彼はこれでまで混合しましたか?
この状況は、すべての取得方法getAppRoutes経路システムであるのでところで、ここでコントローラのすべてのインスタンスの動作が行われます。ここでの核心。
形質転換のためのinitメソッド:
パブリック関数init(){ 親::のinit(); (もし!イベント:: hasHandlers(レスポンス::クラス名()、応答:: EVENT_BEFORE_SEND)){ イベント::上( レスポンス::クラス名()、 応答:: EVENT_BEFORE_SEND、 [$この、 'formatDataBeforeSend'] ); } }
次のようにしかし、この処理の後に、問題があります。
{ "IsSuccess":1、 "のErrMsg": "OK"、 "データ":{ "ERROR_CODE":1、 "メッセージ": "OK"、 "res_msg":{ "利用可能":[ 「/ API / AUTH /ビュー」、 "/ API / AUTH /作成"、 "/ API / AUTH /更新" ]、 "割り当てられた" [ "/ *"、 "/管理/ *" ] } } }
そこの問題がありますが、ここでの問題の原因があるため、通常のトリガーと相まって、ルートコントローラ、としてバインドされたトリガイベントの問題を引き起こしていることです。
次のように先行決意よりも、この問題に加えて、我々は、それを処理しなければなりませんでした。
パブリック関数init(){ 親::のinit(); もし( !イベント:: hasHandlers(レスポンス::クラス名()、応答:: EVENT_BEFORE_SEND) &&!のYii :: $ APP->対応- > hasEventHandlers(レスポンス:: EVENT_BEFORE_SEND) ){ (上のイベント:: レスポンス:: classNameの()、 応答:: EVENT_BEFORE_SEND、 [$この、 'formatDataBeforeSend'] ); } }
それは形式に戻すには二つの方法を含む、とのインタビューで、繰り返しトリガコントローラがインスタンス化されるので、これは一般的に一般的ではありません。したがって、この現象は、特定の状況です。問題が発見されました。