生成可讀的操作日志

簡介
支持 Laravel 的 ORM 、Hyperf 的 ORM 與 ThinkPHP 的 ORM 。
可以生成增、刪、改,包括批量增、刪、改,以及 使用 DB 操作的日志。
安裝
composer require chance-fyi/operation-log
使用 Laravel 的 ORM
首先在數(shù)據(jù)庫的配置文件 config/database.php
中增加兩個配置項 modelNamespace
和 logKey
。
<?php
return [
'default' => env('DB_CONNECTION', 'mysql'),
...
'connections' => [
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
...
...
// 模型所在的命名空間
"modelNamespace" => "Chance\Log\Test\model",
// 日志記錄的主鍵
"logKey" => "id",
],
...
]
...
];
然后注冊 MySQL 數(shù)據(jù)庫連接的解析器。
\Illuminate\Database\Connection::resolverFor('mysql', function ($connection, $database, $prefix, $config) {
return new \Chance\Log\orm\illuminate\MySqlConnection($connection, $database, $prefix, $config);
});
使用 ThinkPHP 的 ORM
在數(shù)據(jù)庫的配置文件 config/database.php 中增加三個配置項 query
、modelNamespace
和 logKey
,并修改 type
與 builder
。
<?php
return [
'default' => env('database.driver', 'mysql'),
...
'connections' => [
'mysql' => [
// 服務(wù)器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 數(shù)據(jù)庫名
'database' => env('database.database', ''),
// 用戶名
'username' => env('database.username', 'root'),
// 密碼
'password' => env('database.password', ''),
// 端口
'hostport' => env('database.hostport', '3306'),
...
...
// 數(shù)據(jù)庫類型
'type' => \Chance\Log\orm\think\MySqlConnection::class,
// 指定查詢對象
"query" => \Chance\Log\orm\think\Query::class,
// Builder類
"builder" => \think\db\builder\Mysql::class,
// 模型所在的命名空間
"modelNamespace" => "Chance\Log\Test\model",
// 日志記錄的主鍵
"logKey" => "id",
],
// 更多的數(shù)據(jù)庫配置信息
...
],
...
];
日志主鍵
可在模型中設(shè)置$logKey
屬性修改需要記錄的主鍵名稱。
<?php
namespace Chance\Log\Test\model;
class User extends BaseModel
{
// 日志記錄的主鍵名稱
public string $logKey = 'id';
}
可讀性設(shè)置
通過表注釋、字段注釋與獲取器來生成可讀性的日志。
表注釋與字段注釋
也可以在模型中通過$tableComment
與$columnComment
設(shè)置表注釋與字段注釋。
<?php
namespace Chance\Log\Test\model;
class User extends BaseModel
{
// 表注釋
public $tableComment = '用戶';
// 字段注釋
public $columnComment = [
'name' => '姓名',
'sex' => '性別',
];
}
獲取器
設(shè)置一個名為字段名_text
的獲取器。
<?php
namespace Chance\Log\Test\model;
class User extends BaseModel
{
// Laravel ORM 獲取器設(shè)置方法
public function getSexTextAttribute($key): string
{
return ['女','男'][($key ?? $this->sex)] ?? '未知';
}
// ThinkPHP ORM 獲取器設(shè)置方法
public function getSexTextAttr($key): string
{
return ['女','男'][($key ?? $this->sex)] ?? '未知';
}
}
日志生成忽略的字段
可在模型中通過 $ignoreLogFields
設(shè)置該表不希望生成日志的字段。
<?php
namespace Chance\Log\Test\model;
class User extends BaseModel
{
// 日志生成忽略的字段
public $ignoreLogFields = [
'create_time',
'update_time',
];
}
數(shù)據(jù)表不生成日志
可在模型中通過 $doNotRecordLog
設(shè)置該表不在生成日志。
<?php
namespace Chance\Log\Test\model;
class User extends BaseModel
{
// 不生成該表的日志
public $doNotRecordLog = true;
}
表模型映射關(guān)系
如果模型文件名與表名不相同,將查找不到表所對應(yīng)的模型。也就無法完成上面一些,需要在模型中設(shè)置的功能。所以可以設(shè)置一個表與模型的映射關(guān)系,來幫助查找表所對應(yīng)的模型。
如果是在 ThinkPHP、Laravel、webman 框架中使用,可使用 php vendor/bin/chance-fyi-operation-log 模型所在目錄
命令來自動構(gòu)建所選目錄中遞歸查找到的所有模型與表的映射關(guān)系。如果命令執(zhí)行失敗,也可選擇手動維護映射關(guān)系,并通過以下方法手動注入表模型映射關(guān)系。
\Chance\Log\facades\OperationLog::setTableModelMapping([
"database1" => [
"table1" => "app\\model\\Table1",
"table2" => "app\\model\\Table2",
],
"database2" => [],
]);
獲取日志信息
\Chance\Log\facades\OperationLog::getLog();
清除日志信息
\Chance\Log\facades\OperationLog::clearLog();
啟用禁用
# 啟用 (默認)
\Chance\Log\facades\OperationLog::enable();
# 禁用
\Chance\Log\facades\OperationLog::disable();