在 ThinkPHP 6 中,當你需要在多個應用中重寫異常處理方式時,可以分別在應用中的 ExceptionHandle.php 和 provider.php 中進行配置。
ExceptionHandle.php 文件用於處理應用程序中的異常,而 provider.php 文件用於設置應用程序中的服務提供者。
以下是一個簡單的例子:
假設你正在開發一個名爲 myapp 的應用程序,它有三個模塊:admin、home 和 api。我們想要在應用程序的多個模塊中重寫異常處理。
- 在每個模塊下的
ExceptionHandle.php文件中重寫render方法:// admin/exception/ExceptionHandle.php namespace app\admin\exception; use think\exception\Handle; use think\Response; class ExceptionHandle extends Handle { public function render($request, \Throwable $e): Response { // 自定義異常處理方式 return "Admin 發生了錯誤:" . $e->getMessage(); } } // home/exception/ExceptionHandle.php namespace app\home\exception; use think\exception\Handle; use think\Response; class ExceptionHandle extends Handle { public function render($request, \Throwable $e): Response { // 自定義異常處理方式 return "Home 發生了錯誤:" . $e->getMessage(); } } // api/exception/ExceptionHandle.php namespace app\api\exception; use think\exception\Handle; use think\Response; class ExceptionHandle extends Handle { public function render($request, \Throwable $e): Response { // 自定義異常處理方式 return "API 發生了錯誤:" . $e->getMessage(); } }- 在每個模塊下的
provider.php文件中註冊服務提供者:// admin/provider.php use app\admin\exception\ExceptionHandle; // 註冊異常處理器 \think\facade\Event::listen('HttpException', ExceptionHandle::class); \think\facade\Event::listen('Throwable', ExceptionHandle::class); // home/provider.php use app\home\exception\ExceptionHandle; // 註冊異常處理器 \think\facade\Event::listen('HttpException', ExceptionHandle::class); \think\facade\Event::listen('Throwable', ExceptionHandle::class); // api/provider.php use app\api\exception\ExceptionHandle; // 註冊異常處理器 \think\facade\Event::listen('HttpException', ExceptionHandle::class); \think\facade\Event::listen('Throwable', ExceptionHandle::class);
- 在每個模塊下的
在上面的代碼中,我們分別在每個應用程序模塊下的 ExceptionHandle.php 文件中重寫了 render 方法來處理異常,並在每個模塊下的 provider.php 文件中註冊了對應的服務提供者來監聽異常並調用激活對應的異常處理類。
如果你不想在每個應用程序模塊下重複創建 ExceptionHandle.php 和 provider.php 文件,你可以將它們放在默認模塊或者全局中來減少代碼重複。
需要注意的是,當更改了應用程序的異常處理方式後,請確保刪除相關應用程序的緩存,否則可能仍然調用原來的異常處理類。