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

Artikel ini menerangkan cara menyesuaikan pengecualian global dalam thinkphp5

Nov 02, 2021 pm 04:07 PM
thinkphp5

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!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah yang perlu saya lakukan jika saya mendapat ralat semasa menggunakan thinkphp5 di Pagoda? Apakah yang perlu saya lakukan jika saya mendapat ralat semasa menggunakan thinkphp5 di Pagoda? Dec 19, 2022 am 11:04 AM

Penyelesaian kepada ralat yang dilaporkan semasa menggunakan thinkphp5 dalam Pagoda: 1. Buka pelayan Pagoda, pasang sambungan php pathinfo dan dayakannya 2. Konfigurasikan fail ".access" dengan kandungan "RewriteRule ^(.*)$ index.php ?s=/$1 [QSA ,PT,L]”; 3. Dalam pengurusan laman web, hanya dayakan pseudo-static thinkphp.

Apakah yang perlu saya lakukan jika penulisan semula url thinkphp5 gagal? Apakah yang perlu saya lakukan jika penulisan semula url thinkphp5 gagal? Dec 12, 2022 am 09:31 AM

Penyelesaian untuk penulisan semula url thinkphp5 tidak berfungsi: 1. Semak sama ada modul mod_rewrite.so dimuatkan dalam fail konfigurasi httpd.conf 2. Tukar Tiada dalam AllowOverride None to All 3. Ubah suai fail konfigurasi Apache .htaccess kepada "RewriteRule ^ (.*)$ index.php [L,E=PATH_INFO:$1]" dan simpannya.

Bagaimana untuk mendapatkan URL yang diminta dalam thinkphp5 Bagaimana untuk mendapatkan URL yang diminta dalam thinkphp5 Dec 20, 2022 am 09:48 AM

Kaedah untuk thinkphp5 untuk mendapatkan URL yang diminta: 1. Gunakan kaedah "$request = Request::instance();" kelas "\think\Request" untuk mendapatkan maklumat URL semasa 2. Gunakan pembantu terbina dalam fungsi "$request-> url()" untuk mendapatkan alamat URL lengkap termasuk nama domain.

Apakah yang perlu saya lakukan jika catatan thinkphp5 tidak mendapat nilai? Apakah yang perlu saya lakukan jika catatan thinkphp5 tidak mendapat nilai? Dec 06, 2022 am 09:29 AM

catatan thinkphp5 tidak boleh mendapatkan nilai kerana TP5 menggunakan fungsi strpos untuk mencari rentetan app/json dalam nilai jenis kandungan Pengepala.

Bagaimana untuk mengalih keluar ikon bar tajuk thinkphp5 Bagaimana untuk mengalih keluar ikon bar tajuk thinkphp5 Dec 20, 2022 am 09:24 AM

Bagaimana untuk mengalih keluar ikon bar tajuk thinkphp5: 1. Cari fail favicon.ico di bawah kerangka kerja thinkphp5 awam 2. Padam fail atau pilih gambar lain untuk menamakannya kepada favicon.ico dan gantikan fail favicon.ico yang asal.

Apakah yang perlu saya lakukan jika thinkphp5 menggesa bahawa pengawal tidak wujud? Apakah yang perlu saya lakukan jika thinkphp5 menggesa bahawa pengawal tidak wujud? Dec 06, 2022 am 10:43 AM

Penyelesaian kepada thinkphp5 yang menyebabkan pengawal tidak wujud: 1. Semak sama ada ruang nama dalam pengawal yang sepadan ditulis dengan betul dan tukarkannya ke ruang nama yang betul 2. Buka fail tp yang sepadan dan ubah suai nama kelas;

Bagaimana untuk menanyakan data semalam dalam ThinkPHP5 Bagaimana untuk menanyakan data semalam dalam ThinkPHP5 Dec 05, 2022 am 09:20 AM

Cara menanyakan data semalam dalam ThinkPHP5: 1. Buka fail berkaitan ThinkPHP5 2. Tanya data semalam melalui ungkapan "db('table')->whereTime('c_time', 'semalam')->select();" .

Bagaimana untuk menyediakan gesaan ralat thinkphp5 Bagaimana untuk menyediakan gesaan ralat thinkphp5 Dec 07, 2022 am 10:31 AM

Cara menetapkan gesaan ralat dalam thinkphp5: 1. Masukkan folder awam dalam direktori akar projek dan buka fail entri index.php 2. Lihat komen pada suis mod nyahpepijat 3. Laraskan nilai pemalar "APP_DEBUG". kepada benar untuk memaparkan gesaan mesej ralat.

See all articles