换了工作之后一直干的是把多个系统集成一起,所以使用了多模块。
然而,每个模块的异常不一定相同,例如 A 模块是官网,B 模块是 api ,那么 A 模块的异常应该显示 404 ,B 模块的异常应该是 返回 json 里面 code = -1
环境
thinkphp6.1
php8.2
配置模块下的 `provider.php` 中配置异常处理类
<?php
use app\website\ExceptionHandle;
// 容器Provider定义文件
return [
'think\exception\Handle' => ExceptionHandle::class,
];
再对异常类进行封装
<?php
namespace app\website;
use app\Request;
use think\exception\Handle;
use think\facade\Log;
use think\Response;
use Throwable;
/**
* 应用异常处理类
*/
class ExceptionHandle extends Handle
{
/**
* 不需要记录信息(日志)的异常类列表
* @var array
*/
protected $ignoreReport = [
];
/**
* 记录异常信息(包括日志或者其它方式记录)
*
* @access public
* @param Throwable $exception
* @return void
*/
public function report(Throwable $exception): void
{
// 使用内置的方式记录异常日志
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @access public
* @param Request $request
* @param Throwable $e
* @return Response
*/
public function render($request, Throwable $e): Response
{
// 开发模式下默认直接显示
if (env("APP_DEBUG")) {
return parent::render($request, $e);
}
// 记录日志
Log::write("异常请求:\n请求IP:{ip} \n请求地址:{domain}{url} \n请求header:{header}请求参数:{params}错误信息:{error} \n", "error", [
"ip" => $request->ip(),
"domain" => $request->domain(),
"url" => $request->url(),
"header" => print_r($request->header(), true),
"params" => print_r($request->param(), true),
"error" => $e->getMessage()
]);
// 这里因为涉及到多模块,做了函数封装
return redirect(getWebsiteUrl($request,"error"));
}
}
因为使用了绑定模块域名,所以我封装了一个函数来解析这写函数,举个例子:
绑定主网站 a.baidu.com , 然后 baidu.com 是官网,当我访问官网的时候, 我期望的是直接访问对应的模块
这样在本地开发和路由的时候会发现路由有点不兼容,你访问 a.baidu.com/website 等于 直接访问 baidu.com
那么,当你再不同的域名下跳转的时候会出现路径一直错误,所以这里我使用了函数封装,下面是函数
function getWebsiteUrl($request, $type = "", $id = 0): string
{
match ($type) {
"news" => $uri = ($id > 1 ? "/news_{$id}.html" : "/news.html"),
"news-detail" => $uri = "/news-{$id}.html",
"product" => $uri = "/product.html",
"product-category" => $uri = "/product_{$id}.html",
"product-detail" => $uri = "/product-{$id}.html",
"service" => $uri = "/service.html",
"about" => $uri = "/about.html",
"about-honor" => $uri = "/honor.html",
"map" => $uri = "/map.html",
"store" => $uri = "/store",
"error" => $uri = "/error",
default => $uri = "",
};
$module = "website";
return $request->domain() . (!websiteDomain($request->host()) ? DIRECTORY_SEPARATOR . $module : "") . $uri;
}
function websiteDomain($host): bool
{
return in_array($host, ["baidu.com", "www.baidu.com"]);
}
官网文档地址:https://www.kancloud.cn/manual/thinkphp6_0/1037615
上一篇: 前端直传OSS...