AdminLogBehavior.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: NODELOG
  5. * Date: 16/7/25
  6. * Time: 下午12:25
  7. */
  8. namespace backend\behaviors;
  9. use common\models\AdminLog;
  10. use Yii;
  11. use yii\base\Application;
  12. use yii\base\Behavior;
  13. use yii\base\Event;
  14. use yii\db\ActiveRecord;
  15. use yii\helpers\Url;
  16. class AdminLogBehavior extends Behavior
  17. {
  18. public function events()
  19. {
  20. return [
  21. Application::EVENT_BEFORE_REQUEST => 'handle'
  22. ];
  23. }
  24. public function handle()
  25. {
  26. Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_UPDATE, [$this, 'log']);
  27. Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, [$this, 'log']);
  28. Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_DELETE, [$this, 'log']);
  29. }
  30. public function log($event)
  31. {
  32. //未登录不保存日志
  33. if($event->sender instanceof AdminLog || !$event->sender->primaryKey() || Yii::$app->user->isGuest) {
  34. return;
  35. }
  36. if ($event->name == ActiveRecord::EVENT_AFTER_INSERT) {
  37. $description = "%s新增了表%s %s:%s的%s";
  38. } elseif($event->name == ActiveRecord::EVENT_AFTER_UPDATE) {
  39. $description = "%s修改了表%s %s:%s的%s";
  40. } else {
  41. $description = "%s删除了表%s %s:%s%s";
  42. }
  43. if (!empty($event->changedAttributes)) {
  44. $desc = '';
  45. foreach($event->changedAttributes as $name => $value) {
  46. $desc .= $name . ' : ' . $value . '=>' . $event->sender->getAttribute($name) . ',';
  47. }
  48. $desc = substr($desc, 0, -1);
  49. } else {
  50. $desc = '';
  51. }
  52. $userName = !Yii::$app->user->isGuest ? Yii::$app->user->identity->username : '未登录用户';
  53. $tableName = $event->sender->tableSchema->name;
  54. $description = sprintf($description, $userName, $tableName, $event->sender->primaryKey()[0], is_array($event->sender->getPrimaryKey()) ? current($event->sender->getPrimaryKey()) : $event->sender->getPrimaryKey(), $desc);
  55. $route = Url::to();
  56. $userId = !Yii::$app->user->isGuest ? Yii::$app->user->id : 0;
  57. $ip = ip2long(Yii::$app->request->userIP);
  58. $data = [
  59. 'route' => $route,
  60. 'description' => $description,
  61. 'user_id' => $userId,
  62. 'ip' => $ip
  63. ];
  64. $model = new AdminLog();
  65. $model->setAttributes($data);
  66. $model->save();
  67. }
  68. }