<?php
/**
 * File: ErrorHandler.php
 * Enconding: UTF-8
 * Using:
 */
namespace app\modules\sys\exception;

use app\modules\sys\log\ImLog;
use yii\web\ErrorHandler;
use Yii;
use yii\web\Response;
use yii\web\NotFoundHttpException;

class ApiErrorHandler extends ErrorHandler
{
    /**
     * 重新ResponseException的输出
     * Renders the exception.
     * @param \Exception $exception the exception to be rendered.
     */
    protected function renderException($exception)
    {
        if (Yii::$app->has('response')) {
            $response = Yii::$app->getResponse();
            // reset parameters of response to avoid interference with partially created response data
            // in case the error occurred while sending the response.
            $response->isSent = false;
            $response->stream = null;
            $response->data = null;
            $response->content = null;
        } else {
            $response = new Response();
        }

        if ($exception instanceof ResponseException) {
            $response->data = $exception;
        } elseif ($exception instanceof NotFoundHttpException) {
            if (YII_ENV_PROD) {
                $msg = '版本低，请更新至新版本';
            } else {
                $msg = 'api错误';
            }

            $data = [
                'code' => '100002',
                'msg'  => $msg
            ];

            $response->data = json_encode($data);
        } else {
            if (YII_ENV_PROD) {
                $msg = '网络错误';
            } else {
                $msg = sprintf(
                    '%s, %s, line:%d',
                    $exception->getMessage(),
                    $exception->getFile(),
                    $exception->getLine()
                );
            }

            $data = [
                'code' => '100001',
                'msg'  => $msg
            ];
            $response->data = json_encode($data);

            $param = Yii::$app->request->post();
            $url = Yii::$app->request->url;
            $logdata = [
                'msg'=>$msg,
                'url'=>$url,
                'param'=>$param,
            ];

            // ImLog::instance('detail_error.log')->Log(json_encode($logdata));
        }

        $response->setStatusCode(200);
        $response->send();
    }
}
