回顾一下中间件的功能
中间件提供了一种方便的机制来过滤进入应用程序的 HTTP 请求。例如,Laravel 包含一个验证用户身份的中间件。如果用户未能通过认证,中间件会把用户重定向到登录页面。反之,用户如果通过验证,中间件将把请求进一步转发到应用程序中。
表设计
CREATE TABLE `admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`route_url` varchar(200) NOT NULL DEFAULT '0' COMMENT '路由',
`desc` varchar(255) DEFAULT '' COMMENT '操作描述',
`log_original` json DEFAULT NULL COMMENT '字段变更前内容',
`log_dirty` json DEFAULT NULL COMMENT '字段变更后内容',
`admin_user_id` int(10) unsigned DEFAULT '0' COMMENT '操作用户',
`created_at` timestamp NULL DEFAULT NULL COMMENT '添加时间',
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1275 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
中间件
app/Http/Middleware/Admin/Log.php
<?php
namespace OpenStrong\StrongAdmin\Http\Middleware;
use Closure;
use OpenStrong\StrongAdmin\Models\AdminLog;
/**
* 日志记录 【后置中间件】
*/
class Log
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//后置中间件,控制器内业务逻辑执行完毕后再执行下面逻辑
//捕获控制器内请求响应
$response = $next($request);
// 利用 try catch 避免记录日志失败导致本次请求不能正常响应
try {
if (!($response instanceof \Illuminate\Http\JsonResponse))
{
return $response;
}
//捕获控制器内请求响应返回的json数据
$response_data = $response->getData(true);
if (!isset($response_data['code']))
{
return $response;
}
if (!isset($response_data['log']) || $response_data['log'] === '')
{
return $response;
}
//记录日志内容
$this->write($request, $response_data);
} catch (\Exception $exception) {
return $response;
}
return $response;
}
protected function write($request, $response_data)
{
$model = new AdminLog();
$model->route_url = $request->getRequestUri();//操作路由
$model->desc = $response_data['log'] ?? '';//日志操作描述
//记录字段的变化:logOriginal 原始字段内容,logDirty 变更字段内容
if (isset($response_data['logDirty']) && !empty($response_data['logDirty']))
{
$model->log_dirty = $response_data['logDirty'];
if (isset($response_data['logOriginal']) && !empty($response_data['logOriginal']))
{
$model->log_original = collect($response_data['logOriginal'])->only(collect($response_data['logDirty'])->keys());
}
}
$model->admin_user_id = $request->user()->id ?? 0;
$model->save();
return true;
}
}
控制器
app/Http/Controllers/AdminUserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use OpenStrong\StrongAdmin\Models\AdminUser;
class AdminUserController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function create(Request $request)
{
$adminUser = new AdminUser();
$adminUser->fill($request->all());
$logDirty = $model->getDirty();//变更字段内容
$logOriginal = $model->getOriginal();//原始字段内容
if ($adminUser->save())
{
return [
'code' => 200,
'message' => __('admin.SuccessCreated'),
'log' => sprintf('[%s][id:%s]', '后台管理员创建成功', $adminUser->id),
'logOriginal' => $logOriginal,
'logDirty' => $logDirty
];
} else
{
return ['code' => 5001, 'message' => __('admin.Server internal error')];
}
}
}
这个功能在strongshop 开源商城也有所应用
Gitee 地址:https://gitee.com/openstrong/strongshop
小伙伴还有什么更好的解决方案?欢迎留言评论!