laravel 多次调用模型事件

laravel model event called multiple times

BaseModel.php

abstract class BaseModels extends Model implements Auditable {

    public function needAudit() {
        return true;
    }

    public function __construct() {
        static::deleting(function ($m) {
            if ($m->needAudit() === true && !app()->runningInConsole() && defined('IN_ADMIN') && IN_ADMIN === true) {
                $admin = \Auth::guard('admin')->user();

                AuditRecords::addLog($admin->username . ' deleted ' . $m->getAuditDescription(), 'delete_' . $m->table, AuditRecords::OPERATION_DELETE, $m);
            }
        });

        static::created(function ($m) {
            if ($m->needAudit() === true && !app()->runningInConsole() && defined('IN_ADMIN') && IN_ADMIN === true) {
                $admin = \Auth::guard('admin')->user();

                AuditRecords::addLog($admin->username . ' created ' . $m->getAuditDescription(), 'create_' . $m->table, AuditRecords::OPERATION_CREATE, $m);
            }
        });

        static::updated(function ($m) {
            if ($m->needAudit() === true && !app()->runningInConsole() && defined('IN_ADMIN') && IN_ADMIN === true) {
                if ($m->exists() && $m->isDirty()) {
                    $admin = \Auth::guard('admin')->user();

                    AuditRecords::addLog($admin->username . ' edited ' . $m->getAuditDescription(), 'edit_' . $m->table, AuditRecords::OPERATION_UPDATE, $m);
                }
            }
        });
    }
}

Country.php

class Country extends BaseModels {

    public function getAuditDescription() {
        return getClassName($this) . ' ' . $this->country_name_en;
    }

    const STATUS_INACTIVE = 0;
    const STATUS_ACTIVE = 1;

    protected $table = 'country';
}

Auditable.php

<?php

namespace App\Models;

interface Auditable {
    public function getAuditDescription();
    public function needAudit();
}

尝试为所有管理路由做一些自动审核日志,使用 laravel eloquent event 删除、创建和更新,但是 \App\Models\Country.php 每次保存记录3次\App\Models\Bank.php 每次保存记录 7 次,结果附上图片

为什么在构造函数中有这些东西?构造函数不是每个 class 一次 运行,每次创建 class 的新实例时它们都是 运行,并且这些注册侦听器的调用是静态的。

每次创建 class 的实例时,您都在添加事件侦听器。您创建该模型的 2 个实例,您将注册 2 个侦听器,因为您调用代码来注册侦听器 2 次。 3 -> 3 次,4 -> 4 次 ....

我也希望这不是真正的构造函数,因为它缺少模型需要拥有和做的所有重要事情。

修复

abstract class BaseModels extends Model implements Auditable {

    public function needAudit() {
        return true;
    }

    //CHANGED THIS, THE FIX
    public static function boot() {
        static::deleting(function ($m) {
            if ($m->needAudit() === true && !app()->runningInConsole() && defined('IN_ADMIN') && IN_ADMIN === true) {
                $admin = \Auth::guard('admin')->user();

                AuditRecords::addLog($admin->username . ' deleted ' . $m->getAuditDescription(), 'delete_' . $m->table, AuditRecords::OPERATION_DELETE, $m);
            }
        });

        static::created(function ($m) {
            if ($m->needAudit() === true && !app()->runningInConsole() && defined('IN_ADMIN') && IN_ADMIN === true) {
                $admin = \Auth::guard('admin')->user();

                AuditRecords::addLog($admin->username . ' created ' . $m->getAuditDescription(), 'create_' . $m->table, AuditRecords::OPERATION_CREATE, $m);
            }
        });

        static::updated(function ($m) {
            if ($m->needAudit() === true && !app()->runningInConsole() && defined('IN_ADMIN') && IN_ADMIN === true) {
                if ($m->exists() && $m->isDirty()) {
                    $admin = \Auth::guard('admin')->user();

                    AuditRecords::addLog($admin->username . ' edited ' . $m->getAuditDescription(), 'edit_' . $m->table, AuditRecords::OPERATION_UPDATE, $m);
                }
            }
        });
    }
}