Skip to content

Commit 4eb8602

Browse files
committed
Add DataBaseListen Middleware
Fix Exception get code and message Signed-off-by: cyd622 <luffywang622@gmail.com>
1 parent c4f680c commit 4eb8602

File tree

4 files changed

+107
-9
lines changed

4 files changed

+107
-9
lines changed

src/Jobs/SaveUserTokenJob.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,14 @@
1010
namespace Cyd622\LaravelApi\Jobs;
1111

1212
use Illuminate\Bus\Queueable;
13-
use Illuminate\Queue\SerializesModels;
14-
use Illuminate\Queue\InteractsWithQueue;
1513
use Illuminate\Contracts\Queue\ShouldQueue;
1614
use Illuminate\Foundation\Bus\Dispatchable;
15+
use Illuminate\Queue\InteractsWithQueue;
1716
use Illuminate\Support\Facades\Cache;
1817

1918
class SaveUserTokenJob implements ShouldQueue
2019
{
21-
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
20+
use Dispatchable, InteractsWithQueue, Queueable;
2221
protected $user;
2322
protected $token;
2423

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
namespace Cyd622\LaravelApi\Middleware;
4+
5+
use Closure;
6+
use Illuminate\Database\Events\QueryExecuted;
7+
use Illuminate\Http\Request;
8+
use Illuminate\Support\Facades\App;
9+
use Illuminate\Support\Facades\DB;
10+
use Illuminate\Support\Facades\Log;
11+
use Illuminate\Support\Str;
12+
use Monolog\Handler\RotatingFileHandler;
13+
use Monolog\Logger;
14+
15+
class DataBaseListenMiddleware
16+
{
17+
/**
18+
* @param Request $request
19+
* @param Closure $next
20+
* @return mixed
21+
* @throws \Exception
22+
*/
23+
public function handle(Request $request, Closure $next)
24+
{
25+
$logMaxFiles = config('laravel_api.middleware.database_listen.log_max_files', 30);
26+
$logFile = storage_path('logs/database/sql.log');
27+
if (version_compare(App::version(), '5.6.0', '>=')) {
28+
// 5.6以上
29+
if (!config('logging.channels.database')) {
30+
$config = [
31+
'driver' => 'daily',
32+
'path' => $logFile,
33+
'days' => $logMaxFiles
34+
];
35+
config(['logging.channels.database' => $config]);
36+
}
37+
38+
$logger = Log::channel('database');
39+
40+
} else {
41+
// 低于5.6版本手动分割日志
42+
$logger = new Logger(App::environment());
43+
$logger->pushHandler(new RotatingFileHandler($logFile, $logMaxFiles));
44+
}
45+
46+
DB::listen(function (QueryExecuted $query) use ($logger, $request) {
47+
$listenType = config('laravel_api.middleware.database_listen.listen_type', [
48+
'select',
49+
'update',
50+
'delete',
51+
'insert',
52+
]);
53+
54+
if (Str::startsWith($query->sql, $listenType)) {
55+
$sqlWithPlaceholders = str_replace(['%', '?'], ['%%', '%s'], $query->sql);
56+
$bindings = $query->connection->prepareBindings($query->bindings);
57+
$pdo = $query->connection->getPdo();
58+
$realSql = vsprintf($sqlWithPlaceholders, array_map([$pdo, 'quote'], $bindings));
59+
$duration = $this->formatDuration($query->time / 1000);
60+
$logger->debug(sprintf('[%s] %s | %s: %s', $duration, $realSql, $request->method(), $request->getRequestUri()));
61+
}
62+
});
63+
64+
return $next($request);
65+
}
66+
67+
/**
68+
* Format duration.
69+
*
70+
* @param float $seconds
71+
*
72+
* @return string
73+
*/
74+
private function formatDuration($seconds)
75+
{
76+
if ($seconds < 0.001) {
77+
return round($seconds * 1000000) . 'μs';
78+
} elseif ($seconds < 1) {
79+
return round($seconds * 1000, 2) . 'ms';
80+
}
81+
return round($seconds, 2) . 's';
82+
}
83+
}

src/Response/ExceptionReport.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,19 @@ public function report()
179179
}
180180

181181
// 如果什么都拿不到默认就500了
182-
$httpCode = $httpCode ?? 500;
182+
$httpCode = $httpCode ?? config('laravel_api.exception.default_http_code', 500);
183183

184-
$statusCode = data_get($reportMessage, 'status_code', $httpCode);
184+
$statusCode = data_get($reportMessage, 'status_code');
185+
if (!$statusCode && method_exists($this->exception, 'getCode')) {
186+
$statusCode = $this->exception->getCode();
187+
}
188+
$statusCode = $statusCode ?: $httpCode;
185189

186190
// 非生产环境显示错误详情
187191
if (config('app.env') != 'production') {
188192
$message = $this->exception->getMessage() ?: data_get($reportMessage, 'msg', 'error');
189193
} else {
190-
$message = data_get($reportMessage, 'msg', 'error');
194+
$message = data_get($reportMessage, 'msg', $this->exception->getMessage());
191195
}
192196

193197
// 表单验证异常返回的是数组,这里返回第一个错误消息

src/config.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,29 @@
44
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
55

66
return [
7-
'response'=>[
7+
'response' => [
88
// 页码信息返回字段
9-
'page_info'=>[
9+
'page_info' => [
1010
'current_page',
1111
'last_page',
1212
'per_page',
1313
'total',
1414
],
1515
],
16+
'middleware' => [
17+
'database_listen' => [
18+
'log_max_files' => 30,
19+
'listen_type' => [
20+
'select',
21+
'update',
22+
'delete',
23+
'insert',
24+
]
25+
],
26+
],
1627
'exception' => [
17-
'do_report'=>[
28+
'default_http_code' => 500,
29+
'do_report' => [
1830
UnauthorizedHttpException::class => [
1931
'msg' => '未授权或Token签名失效',
2032
'http_code' => 401,

0 commit comments

Comments
 (0)