elstc / cakephp-activity-logger
CakePHP 活动记录插件
v3.0.1
2024-09-06 02:42 UTC
Requires
- php: >=8.1
- ext-json: *
- ext-pdo: *
- cakephp/cakephp: ^5.0
- psr/log: ^3.0
Requires (Dev)
- cakephp/authentication: ^3.0
- cakephp/cakephp-codesniffer: ^5.0
- cakephp/migrations: ^4.0
- phpunit/phpunit: ^10.1
This package is auto-updated.
Last update: 2024-09-06 02:45:43 UTC
README
安装
您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。
安装 composer 包的推荐方法是
composer require elstc/cakephp-activity-logger:^3.0
加载插件
通过在您的项目 src/Application.php
文件中添加以下语句来加载插件
$this->addPlugin('Elastic/ActivityLogger');
创建 activity_logs 表
运行迁移命令
bin/cake migrations migrate -p Elastic/ActivityLogger
用法
附加到表
class ArticlesTable extends Table { public function initialize(array $config): void { // ... $this->addBehavior('Elastic/ActivityLogger.Logger', [ 'scope' => [ 'Articles', 'Authors', ], ]); } }
活动记录基础
创建时记录
$artice = $this-Articles->newEnity([ /* ... */ ]); $this->Articles->save($artice); // saved log // [action='create', scope_model='Articles', scope_id=$article->id]
更新时记录
$artice = $this-Articles->patchEnity(artice, [ /* ... */ ]); $this->Articles->save($artice); // saved log // [action='update', scope_model='Articles', scope_id=$article->id]
删除时记录
$artice = $this-Articles->get($id); $this->Articles->delete($artice); // saved log // [action='delete', scope_model='Articles', scope_id=$article->id]
使用发布者进行活动记录
$this->Articles->setLogIssuer($author); // Set issuer $artice = $this-Articles->newEnity([ /* ... */ ]); $this->Articles->save($artice); // saved log // [action='create', scope_model='Articles', scope_id=$article->id, ...] // and // [action='create', scope_model='Auhtors', scope_id=$author->id, ...]
AutoIssuerComponent
如果您使用 Authorization
插件或 AuthComponent
,则 AutoIssuerComponent
将帮助设置表的发布者。
// In AppController class AppController extends Controller { public function initialize(): void { // ... $this->loadComponent('Elastic/ActivityLogger.AutoIssuer', [ 'userModel' => 'Users', ]); // ... } }
如果在执行 Controller.startup
事件之前对任何表类进行了加载,请描述 initializedTables
选项。
例如
// In AppController class AppController extends Controller { public function initialize(): void { $this->loadModel('Articles'); $this->loadModel('Awesome.Favorites'); // ... $this->loadComponent('Elastic/ActivityLogger.AutoIssuer', [ 'userModel' => 'Users', 'initializedTables' => [ 'Articles', 'Awesome.Favorites', ], ]); // ... } }
使用范围进行活动记录
class CommentsTable extends Table { public function initialize(array $config): void { // ... $this->addBehavior('Elastic/ActivityLogger.Logger', [ 'scope' => [ 'Articles', 'Authors', 'Users', ], ]); } }
$this->Comments->setLogScope([$user, $article]); // Set scope $comment = $this-Comments->newEnity([ /* ... */ ]); $this->Comments->save($comment); // saved log // [action='create', scope_model='Users', scope_id=$article->id, ...] // and // [action='create', scope_model='Articles', scope_id=$author->id, ...]
使用消息进行活动记录
使用 setLogMessageBuilder
方法。您可以为日志中的每个操作生成任何消息。
class ArticlesTable extends Table { public function initialize(array $config): void { // ... $this->addBehavior('Elastic/ActivityLogger.Logger', [ 'scope' => [ 'Articles', 'Authors', ], ]); // ADD THIS $this->setLogMessageBuilder(static function (ActivityLog $log, array $context) { if ($log->message !== null) { return $log->message; } $message = ''; $object = $context['object'] ?: null; $issuer = $context['issuer'] ?: null; switch ($log->action) { case ActivityLog::ACTION_CREATE: $message = sprintf('%3$s created #%1$s: "%2$s"', $object->id, $object->title, $issuer->username); break; case ActivityLog::ACTION_UPDATE: $message = sprintf('%3$s updated #%1$s: "%2$s"', $object->id, $object->title, $issuer->username); break; case ActivityLog::ACTION_DELETE: $message = sprintf('%3$s deleted #%1$s: "%2$s"', $object->id, $object->title, $issuer->username); break; default: break; } return $message; }); } }
或者在使用 save|delete 操作之前使用 setLogMessage
。您可以设置日志消息。
$this->Articles->setLogMessage('Custom Message'); $this->Articles->save($entity); // saved log // [action='update', 'message' => 'Custom Messages', ...]
保存自定义日志
$this->Articles->activityLog(\Psr\Log\LogLevel::NOTICE, 'Custom Messages', [ 'action' => 'custom', 'object' => $artice, ]); // saved log // [action='custom', 'message' => 'Custom Messages', scope_model='Articles', scope_id=$article->id, ...]
查找活动日志
$logs = $this->Articles->find('activity', ['scope' => $article]);