ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[PHP] laravel的异常处理

2021-09-04 11:03:56  阅读:233  来源: 互联网

标签:laravel code self ApiCode FAILED getMessage PHP 异常 response


laravel默认的异常处理是展示出异常的界面,不能够完善的捕获异常并响应为json格式数据

需要修改下以下文件

app/Exceptions/Handler.php

 

<?php

namespace App\Exceptions;

use App\Lib\ApiHelper\ApiCode;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Throwable;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'current_password',
        'password',
        'password_confirmation',
    ];

    /**
     * Register the exception handling callbacks for the application.
     *
     * @return void
     */
    public function register()
    {
        $this->reportable(function (Throwable $e) {
            //
        });
    }

    public function render($request, Throwable $e)
    {
        switch ($e) {
            case $e instanceof ValidationException:
                $response = [
                    'errmsg' => Arr::first($e->errors())[0] ?? '请求参数不合法',
                    'errcode' => ApiCode::FAILED,
                    'data' => new \stdClass()
                ];

                break;
            case $e instanceof HttpException:
                $response = [
                    'errmsg' => ApiCode::getMessage(ApiCode::FAILED_HTTP),
                    'errcode' => ApiCode::FAILED_HTTP,
                    'data' => new \stdClass()
                ];

                break;
            default:
                $code = $e->getCode() ?: ApiCode::FAILED;
                $response = [
                    'errmsg' => $e->getMessage() ?: ApiCode::getMessage($code),
                    'errcode' => $code,
                    'data' => new \stdClass()
                ];
        }

        if (config('app.debug')) {
            $response['exception'] = get_class($e);
            $response['message'] = $e->getMessage();
            $response['trace'] = $e->getTrace();
        }
        return response()->json($response,200,[],JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
    }
}

 

ApiCode类

app/Lib/ApiHelper/ApiCode.php

<?php
namespace App\Lib\ApiHelper;

class ApiCode
{
    const OK = 20000;
    const FAILED_PARAMES = 40001;
    const FAILED = 50000;
    const FAILED_NO_EXIST = 50001;
    const FAILED_AUTH_EXPIRED = 50002;
    const FAILED_HTTP = 50003;
    public static $messageMapper = [
        self::OK => '成功',
        self::FAILED => '失败',
        self::FAILED_HTTP => 'HTTP请求异常',
        self::FAILED_NO_EXIST => '授权码不存在',
        self::FAILED_AUTH_EXPIRED => '授权码过期'
    ];

    /**
     * Get code message
     * @param $code
     * @return string
     */
    public static function getMessage($code)
    {
        return self::$messageMapper[$code] ?? '服务器未知错误';
    }
}

 

标签:laravel,code,self,ApiCode,FAILED,getMessage,PHP,异常,response
来源: https://www.cnblogs.com/taoshihan/p/15226019.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有