検索
ホームページPHPフレームワークThinkPHPこの記事では、thinkphp5 でグローバル例外をカスタマイズする方法について説明します。

次のthinkphp フレームワークチュートリアル コラムでは、thinkphp5 でグローバル例外をカスタマイズする方法について説明します。困っている友人の役に立てば幸いです。

API作成時の各種エラーに対して理不尽なjsonを返すには、TP5付属のプロンプトエラーページを直接利用しますが、クライアント側では当然効果がないので、グローバル例外を自分でカスタマイズする必要があります。 。

1. グローバル例外クラスを作成します (エラー メッセージ、ステータス コードなどの送信に使用されます)

use think\Exception;
class BaseException extends Exception {
    /** HTTP 状态码
     * @var string
     */
    public $code;
    
    /** 自定义错误码
     * @var string
     */
    public $errorCode;
    
    /** 错误信息
     * @var string
     */
    public $msg;
    
    public function __construct($params=[])
    {
        if (! $params) {
            return ;
        }
        
        // 如果传了 code
        if ($array_key_exists('code', $code) {
            $this->code = $code;
        }
        
        // 如果传了 errorCode
        if (array_key_exists('errorCode', $params)) {
            $this->errorCode = $params['errorCode'];
        }
        // 如果传了 msg
        if (array_key_exists('msg', $params)) {
            $this->msg = $params['msg'];
        }
    }
}

これにより、ステータス コード、エラー メッセージ、カスタム エラー コードを与えることができます。渡されます。

2. エラー処理クラスの作成

エラー処理クラスは、TP5 に付属のエラー処理クラスを継承しており、render メソッドをオーバーライドすることで、エラーをカスタマイズできます。

use Exception;
use think\exception\Handle;
use think\Request;
class ExceptionHandle extends Handle 
{
    /** 状态码
     * @var
     */
    private $code;
    /** 自定义错误码
     * @var
     */
    private $errorCode;
    /** 错误信息
     * @var
     */
    private $msg;
    
    /** 重写 Handle 方法里的Render
     * @param Exception $e
     * @return \think\response\Json
     */
            // 注意这里是基类 Exception
    public function render(Exception $e) 
    {
        if ($e instanceof BaseException) {
            //如果是自定义异常,则控制http状态码,不需要记录日志
            //因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
            //不应当记录日志
            $this->msg = $e->msg;
            $this->code = $e->code;
            $this->errorCode = $e->errorCode;
        } else {
            // 如果是服务器未处理的异常,将http状态码设置为500,并记录日志
            if (config('app_debug')) {
                // 调试状态下需要显示TP默认的异常页面,因为TP的默认页面
                // 很容易看出问题
                return parent::render($e);
            }
            $this->code = 500;
            $this->msg = '服务器内部错误,不想告诉你';
            $this->errorCode = 999;
            $this->recordErrorLog($e);
        }
        $request = Request::instance();
        $result = [
            'msg' => $this->msg,
            'errorCode' => $this->errorCode,
            'request_url' => $request->url()
        ];
        return json($result, $this->code);
    }
    
    /** 错误日志处理
     *  这里把config里日志配置的type改为test
     * @param Exception $e
     */
    private function recordErrorLog(Exception $e)
    {
        // 开启日志
        Log::init([
            'type'  =>  'File',
            'path'  =>  LOG_PATH,
            'level' => ['error']
        ]);
        
        // 日志记录方法
        Log::record($e->getMessage(),'error');
    }
    
}

3. 構成 config を変更します

// 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle'       => 'app\lib\exception\ExceptionHandle',
    
// 关闭日志    
'log'                    => [
        // 日志记录方式,内置 file socket 支持扩展
        // 关闭自动记录日志,请将type设置为test
        'type'  => 'test',
        // 日志保存目录
        'path'  => __DIR__.'/../log/',
        // 日志记录级别
        'level' => ['sql'],
    ],

4. エラー クラス メソッドを使用します

// 这里随便创建一个userControlelr
class UserController extends Controller {
    use app\api\model\User;
    
    /**
    * 根据 id 获取某个用户
    */
    public function getUser($id)
    {
        $user = User::get($id);
        
        // 如果 $user 为空 抛出自定义的错误,下面有...
        if(! $user) {
            throw UserMissException();
        }
        
        return json($user);
    }
}

カスタマイズされたエラー サブクラス

// 上面第一节,写的 Base 错误类派上用场了。 
class UserMissException extends BaseException
{
    /** HTTP 状态码
     * @var string
     */
    public $code = '404';
    /** 自定义错误码
     * @var string
     */
    public $errorCode = '40000';
    /** 错误信息
     * @var string
     */
    public $msg = '请求的用户不存在';
}

この getUser メソッドを要求し、エラーreport~ は、

{
    "msg": "请求的用户不存在",
    "errorCode": "40000",
    "request_url": "/api/v1/user/10"
}

他のエラー タイプを表示します。引き続き例外サブクラスを作成し、これらのエラー属性を定義できます。

5. まとめ

Laravel フレームワークを含む TP5 フレームワークだけでなく、例外クラスの render メソッドを自分で書き換えて、目的のエラー戻りデータやページを実現することもできます。ステンシル。

以上がこの記事では、thinkphp5 でグローバル例外をカスタマイズする方法について説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はjuejinで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
ThinkPHPの組み込みテストフレームワークの主な機能は何ですか?ThinkPHPの組み込みテストフレームワークの主な機能は何ですか?Mar 18, 2025 pm 05:01 PM

この記事では、ThinkPHPの組み込みテストフレームワークについて説明し、ユニットや統合テストなどの主要な機能と、早期のバグ検出とコード品質の向上を通じてアプリケーションの信頼性を高める方法について強調しています。

リアルタイムの株式市場データフィードを構築するためにThinkPhpを使用する方法は?リアルタイムの株式市場データフィードを構築するためにThinkPhpを使用する方法は?Mar 18, 2025 pm 04:57 PM

記事では、リアルタイムの株式市場データフィードにThinkPhpを使用して、セットアップ、データの正確性、最適化、セキュリティ対策に焦点を当てて説明します。

サーバーレスアーキテクチャでThinkPhpを使用するための重要な考慮事項は何ですか?サーバーレスアーキテクチャでThinkPhpを使用するための重要な考慮事項は何ですか?Mar 18, 2025 pm 04:54 PM

この記事では、パフォーマンスの最適化、ステートレス設計、セキュリティに焦点を当てたサーバーレスアーキテクチャでThinkPhpを使用するための重要な考慮事項について説明します。コスト効率やスケーラビリティなどの利点を強調しますが、課題にも対処します

ThinkPhpマイクロサービスでサービスの発見と負荷分散を実装する方法は?ThinkPhpマイクロサービスでサービスの発見と負荷分散を実装する方法は?Mar 18, 2025 pm 04:51 PM

この記事では、セットアップ、ベストプラクティス、統合方法、および推奨ツールに焦点を当てたThinkPhpマイクロサービスにサービスの発見と負荷分散の実装について説明します。[159文字]。

ThinkPhpの依存関係噴射コンテナの高度な機能は何ですか?ThinkPhpの依存関係噴射コンテナの高度な機能は何ですか?Mar 18, 2025 pm 04:50 PM

ThinkPHPのIOCコンテナは、PHPアプリで効率的な依存関係管理のための怠zyなロード、コンテキストバインディング、メソッドインジェクションなどの高度な機能を提供します。

リアルタイムのコラボレーションツールを構築するためにThinkPhpを使用する方法は?リアルタイムのコラボレーションツールを構築するためにThinkPhpを使用する方法は?Mar 18, 2025 pm 04:49 PM

この記事では、ThinkPhpを使用してリアルタイムのコラボレーションツールを構築し、セットアップ、Websocket統合、セキュリティベストプラクティスに焦点を当てて説明します。

SaaSアプリケーションを構築するためにThinkPhpを使用することの主な利点は何ですか?SaaSアプリケーションを構築するためにThinkPhpを使用することの主な利点は何ですか?Mar 18, 2025 pm 04:46 PM

ThinkPhpは、軽量のデザイン、MVCアーキテクチャ、および拡張性を備えたSaaSアプリに利益をもたらします。スケーラビリティを向上させ、開発を速め、さまざまな機能を通じてセキュリティを改善します。

ThinkPhpとRabbitmqを使用して分散タスクキューシステムを構築する方法は?ThinkPhpとRabbitmqを使用して分散タスクキューシステムを構築する方法は?Mar 18, 2025 pm 04:45 PM

この記事では、ThinkPhpとRabbitMQを使用して分散タスクキューシステムの構築を概説し、インストール、構成、タスク管理、およびスケーラビリティに焦点を当てています。重要な問題には、Immedのような一般的な落とし穴を避けるための高可用性の確保が含まれます

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。