thinkphp 利用中间件 实现日志操作记录

19 篇文章 0 订阅

声明,本文大部分代码都是参考esayadmin框架,地址:https://github.com/zhongshaofa/easyadmin

SystemLogService.php

<?php
/**
 * Created by.
 * User: Jim
 * Date: 2020/10/16
 * Time: 10:23
 */

namespace app\index\services;


use think\Db;
use think\facade\Config;

class SystemLogService
{
    /**
     * 实例
     * @var null
     */
    protected static $instance = null;

    /**
     * 表前缀
     * @var string
     */
    protected $tablePrefix;

    /**
     * 表后缀
     * @var string
     */
    protected $tableSuffix;

    /**
     * 表名
     * @var string
     */
    protected $tableName;

    protected function __construct()
    {
        $this->tablePrefix = Config::get('database.prefix');
        $this->tableSuffix = date('Ym', time());
        $this->tableName = "{$this->tablePrefix}system_log_{$this->tableSuffix}";
    }

    protected function __clone()
    {
        // TODO: Implement __clone() method.
    }


    public static function instance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new static();
        }

        return self::$instance;
    }


    public function save($data = [])
    {
        if (empty($data)) return false;
        $this->detectTable();

        Db::startTrans();
        try {
            Db::table($this->tableName)->insert($data);
            Db::commit();
        } catch (\Exception $e) {
            return $e->getMessage();
        }
        return true;
    }


    protected function detectTable()
    {
        $check = Db::query("show tables like '{$this->tableName}'");

        if (empty($check)) {
            $sql = $this->getCreateSql();
            Db::execute($sql);
        }
        return true;
    }


    /**
     * 根据后缀获取创建表的sql
     * @return string
     */
    protected function getCreateSql()
    {
        return <<<EOT
CREATE TABLE `{$this->tableName}` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `admin_id` int(10) unsigned DEFAULT '0' COMMENT '管理员ID',
  `url` varchar(1500) NOT NULL DEFAULT '' COMMENT '操作页面',
  `method` varchar(50) NOT NULL COMMENT '请求方法',
  `title` varchar(100) DEFAULT '' COMMENT '日志标题',
  `content` text NOT NULL COMMENT '内容',
  `ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'IP',
  `useragent` varchar(255) DEFAULT '' COMMENT 'User-Agent',
  `create_time` int(10) DEFAULT NULL COMMENT '操作时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=630 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='后台操作日志表 - {$this->tableSuffix}';
EOT;
    }


}

注册中间件

创建文件

php think make:middleware AdminAuth

代码:

<?php

namespace app\http\middleware;

use app\Admin\services\SystemLogService;

class AdminAuth
{
    public function handle($request, \Closure $next)
    {
//        if (condition..) {
//
//        }
        $data['admin_id'] = 'admin_id';
        $data['url'] = 'url';
        $data['method'] = 'method';
        $data['title'] = 'title';
        $data['content'] = 'content';
        $data['ip'] = 'ip';
        $data['useragent'] = 'useragent';
        $data['create_time'] = 'create_time';
        SystemLogService::instance()->save($data);
        return $next($request);
    }
}

配置中间件

来到 middleware.php配置文件中, 如果不存在,则创建

配置内容

<?php
/**
 * Created by.
 * User: Jim
 * Date: 2020/10/16
 * Time: 9:16
 */
return [
    \app\http\middleware\AdminAuth::class,
];
ThinkPHP8 中间件是一种用于处理HTTP请求前后执行的一些任务的机制。它可以增强应用的安全性和功能,例如日志记录、用户认证、缓存控制等。 ### ThinkPHP8 控制器中间件简介 #### 定义 控制器中间件是应用于控制器之前的一组函数,它们能够对控制器的操作提供额外的功能。它允许开发者在所有请求到达特定控制器及其对应的操作前运行一组自定义逻辑。这有助于在执行控制器业务逻辑之前完成一些通用的任务,比如检查用户权限、设置响应头、验证输入数据等。 #### 示例配置 在一个典型的ThinkPHP8项目中,你可以通过以下方式启用控制器中间件: ```php // 配置文件中添加中间件配置 return [ 'middleware' => [ // 具体的中间件 'yourMiddlewareClassName' => [ // 中间件处理顺序,默认从上到下依次执行 'before' => ['action', 'view'], // 可选的错误处理函数 'onException' => '\think\ExceptionHandler' ], ], ]; ``` 在这里,`'yourMiddlewareClassName'` 应替换为你实际创建的中间件类名。`'action'` 和 `'view'` 示分别在控制器方法执行前后执行该中间件。 #### 使用场景举例 1. **日志记录**:可以在每个控制器动作之前加入日志记录中间件记录用户的访问信息及操作详情。 2. **权限验证**:可以添加一个中间件来检查用户是否拥有访问当前控制器或其操作所需的权限。 3. **跨域资源共享(CORS)控制**:用于处理跨域请求,如设置合适的 `Access-Control-Allow-Origin`, `Access-Control-Allow-Methods` 等 HTTP 标头。 4. **性能监控**:在某些中间件中添加代码来监测每个请求的时间消耗,帮助分析和优化应用性能。 #### 实现步骤 1. 创建中间件类:继承 `\think\middleware\BaseMiddleware` 并实现其方法,如 `handle()` 来放置你需要执行的逻辑。 2. 注册中间件:将创建的中间件类实例注册到应用配置中,并指定其执行顺序。 3. 应用中间件:在需要使用特定中间件的控制器中引用并应用它。 通过合理利用控制器中间件,可以显著提升应用程序的管理和维护效率,同时增加应用的健壮性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值