laravel模型事件多次调用

时间:2018-07-19 19:22:14

标签: php laravel laravel-5 eloquent laravel-5.6

BaseModel.php

iterator

Country.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);
                }
            }
        });
    }
}

Auditable.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';
}

尝试使用laravel eloquent event删除,创建和更新所有admin路由的一些自动审核日志,但 \ App \ Models \ Country.php 日志每次保存> 3次 , \ App \ Models \ Bank.php 记录 7次 每次保存,都会生成附加图片

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

我还希望这不是真正的构造函数,因为它缺少模型需要具备和执行的所有重要内容。

答案 1 :(得分:1)

修复

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);
                }
            }
        });
    }
}