形で最も一般的な間違いは、例えば、我々の最初の考えは等を捕捉しようと{}キャッチ(){}を使用することであるようにはコントローラやアクションが存在しませんがあります。
/ * * 復帰に統一されたインタフェース - *ショーで定義された一般的な方法ではなかったです * @return配列 * / パブリック 関数のテスト(){ 試みます{ モデル( "ASDA" )。 } キャッチ(\ 例外 の$ E ){ リターンショー(0、$電子 - >のgetMessage()、 ''、400 ) } }
しかし、いくつかのミスは、私たちは、返します、次の形式をキャプチャする方法がありません
私たちのAPIはので、どのように我々はそれを解決しなければならないような場合を識別する方法はありませんか?
まず、関係なく、彼はメカニズムをレンダリングする彼自身の過ちを持っているものの枠組み我々はそれを修正するために、このレンダリング・メカニズムを見つける必要がありTP5の枠組みthinkphp /ライブラリ/は/例外/考える Handle.phpは、このファイルを持っているレンダリング方法
/ * * * HTTPレスポンスに例外をレンダリングします。 * * @paramの\例外の$ E * @return応答 * / 公共の 機能レンダリング(例外 の$ E ) { もし($この - >レンダリング&& $この - > レンダリングのinstanceof \クロージャー){ $結果 = call_user_func_array($この - >レンダリング、[ $電子])。 もし($結果){ 戻り ます$ result ; } } もし($ E instanceofはHttpException){ 返す $この > renderHttpException( - $ eを;) } 他{ 返す $この > convertExceptionToResponse( - $ eを;) } }
私たちは、それは私たちが望むJSON形式のデータを返すように、このメソッドをオーバーライドする必要があります
ハンドルクラスを継承して新しいクラスを作成します。
<?PHP 共通\ libに\例外\名前空間のアプリ。 使用 \考える例外\ハンドルを。 / * * * PhpStormによって作成されます。 *ユーザー:管理者 *日:2019年8月15日 *時間:午前11時20分 * / クラス ApiHandleExceptionは拡張ハンドル { 公共 $ httpCode = 500 ; パブリック 関数は、レンダリング(\ 例外 の$ E ){ リターンショー(0、$電子 - >のgetMessage()、[]、$この - > httpCode); } }
また、TP5プロファイル内のアプリケーションの\ config.phpファイルには約163行書かれた例外処理クラスの後に変更する必要が
'exception_handle' => '\アプリ\共通\ libに\例外の\ ApiHandleException'
私たちは、クラスの復興を指します
次に我々はそれをしたいJSON形式を返します。リクエストに行きます
しかし、問題は、私たちが現れた場合、その状態は以下のコード500を与えられるまで来ます
パブリック 関数のテスト(){ $データ = [ 'AA' => 1、 'SS' => 2、 ]; IF($データ。![ 'SS'] = 1 ){ 例外( 'データは、あなたが提出した質問があります' ); } }
だから我々は、内部例外クラスを作成する必要があります
<?PHP / * * * PhpStormによって作成されます。 *ユーザー:管理者 *日:2019年8月15日 *時間:11時36 * / 共通\ libに\例外\名前空間のアプリ。 使用 \考える例外を。 クラスにApiExceptionは、拡張 例外を { 公共 $メッセージ = '' ; 公共 $ httpCode = 500 ; 公共 $コード = 0 ; パブリック 関数 __construct($メッセージ = ''、$ httpCode = 0、$コード = 0 ) { これを$ - > httpCode = $ httpCode 。 $この - >メッセージ= $メッセージ; $この - >コード= $コード。 } }
あなたは、我々が以前に作成したApiHandleExecptionクラスを変更する必要があることを作成した後
<?PHP 共通\ libに\例外\名前空間のアプリ。 使用 \考える例外\ハンドルを。 / * * * PhpStormによって作成されます。 *ユーザー:管理者 *日:2019年8月15日 *時間:午前11時20分 * / クラス ApiHandleExceptionは拡張ハンドル { 公共 $ httpCode = 500 ; 公共の 関数は(\レンダリング例外 $ eを{) の場合($電子にApiExceptionのinstanceof){
## $ E-> httpCode就是にApiException里面的の$ this - > httpCode。 $この - > httpCode = $ E - > httpCode。 } リターン・ショー(0、$電子 - >のgetMessage()、[]、$この - > httpCode); } }
私たちのステータスコードが変更されますが、我々が原因APIのこの異常な形のさらなる最適化ApiHandleExceptionクラスを必要とするように見ることであり、我々は開発する必要があるときに我々は、コードを修正するようにして間違ってレンダリングされます
<?PHP 名前空間のアプリ\共通\ libに\ execption。 使用Configを\と思います。 使用 \考える例外\ハンドルを。 / * * * PhpStormによって作成されます。 *ユーザー:管理者 *日:2019年8月15日 *時間:午前11時20分 * / クラス ApiHandleExecptionは拡張ハンドル { 公共 $ httpCode = 500 ; 公共の 関数は(\レンダリング例外 $ Eを{)
デバッグモードが有効かの方法が自分の親をレンダリングレンダリング異常でオンになっている場合は##判断し たIF(コンフィグ(「app_debugは」)== trueに{) リターン親::(レンダリング$ Eを); } もし($電子にApiExceptionのinstanceof){ $本 > httpCode = - $ E - > ; httpCode } リターン・ショー(0、$電子 - >のgetMessage()、[]、$この - > httpCode); } }
これまでのところ、私たちの内側の例外は、次のカーディングプロセスを解決します。
後の最初の後、私たちはそれらの状態の初期化コードやその他のデータを初期化するために、新しいクラス(にApiException)を作成する必要があるので、私たちはさらなる変更を必要とする状態コードを変更する必要が復興のそのrenderメソッドの内部例外レンダリングクラス(ApiHandleException)復興を見つける必要があります我々は、それが適切にデバッグモードでレンダリングできるように、例外はクラス(ApiHandleException)をレンダリング書きました