Rumah > rangka kerja php > ThinkPHP > Artikel ini menerangkan cara menyesuaikan pengecualian global dalam thinkphp5

Artikel ini menerangkan cara menyesuaikan pengecualian global dalam thinkphp5

藏色散人
Lepaskan: 2021-11-02 16:07:35
ke hadapan
2542 orang telah melayarinya

Lajur tutorial rangka kerja thinkphp berikut akan menerangkan cara menyesuaikan pengecualian global dalam thinkphp5, saya harap ia dapat membantu rakan yang memerlukan.

Untuk mengembalikan json yang tidak munasabah untuk pelbagai ralat semasa menulis api, terus gunakan halaman ralat segera yang disertakan dengan TP5 Untuk pelanggan, ia jelas tidak mempunyai kesan, jadi anda perlu menyesuaikan pengecualian global sendiri. .

1. Buat kelas pengecualian global (digunakan untuk menghantar mesej ralat, kod status, dll.)

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'];
        }
    }
}
Salin selepas log masuk

Dengan cara ini, anda boleh menghantar kod status, mesej ralat dan kod ralat penyesuaian .

2. Cipta kelas pengendalian ralat

Kelas pengendalian ralat mewarisi daripada kelas pengendalian ralat yang disertakan dengan TP5 dan menggantikan kaedah pemaparan untuk menyesuaikan ralat.

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');
    }
    
}
Salin selepas log masuk

3 Ubah suai konfigurasi konfigurasi

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

4 Gunakan kaedah kelas ralat

// 这里随便创建一个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);
    }
}
Salin selepas log masuk

Subkelas ralat tersuai

// 上面第一节,写的 Base 错误类派上用场了。 
class UserMissException extends BaseException
{
    /** HTTP 状态码
     * @var string
     */
    public $code = '404';
    /** 自定义错误码
     * @var string
     */
    public $errorCode = '40000';
    /** 错误信息
     * @var string
     */
    public $msg = '请求的用户不存在';
}
Salin selepas log masuk
<. 🎜>Minta kaedah getUser ini dan laporkan ralat~ Ia akan memaparkan

{
    "msg": "请求的用户不存在",
    "errorCode": "40000",
    "request_url": "/api/v1/user/10"
}
Salin selepas log masuk
jenis ralat lain dan anda boleh terus mencipta subkelas pengecualian dan mentakrifkan atribut ralat ini.

5. Ringkasan

Bukan sahaja dalam rangka kerja TP5, termasuk rangka kerja laravel, anda juga boleh menulis semula kaedah render kelas pengecualian sendiri untuk mencapai data pengembalian ralat atau halaman yang anda inginkan. stensil.

Atas ialah kandungan terperinci Artikel ini menerangkan cara menyesuaikan pengecualian global dalam thinkphp5. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.im
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan