代码之家  ›  专栏  ›  技术社区  ›  user259752

多次调用Laravel模型事件

  •  1
  • user259752  · 技术社区  · 8 年前

    基本模型.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);
                    }
                }
            });
        }
    }
    

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

    可审核.php

    <?php
    
    namespace App\Models;
    
    interface Auditable {
        public function getAuditDescription();
        public function needAudit();
    }
    

    尝试为所有管理路由执行一些自动审核日志,使用 laravel eloquent event 删除、创建和更新,但 \应用程序\模型\国家.php 记录 3次 每次救球时, \应用程序\模型\银行.php 记录 7次 每次保存时,都会导致附加图像

    enter image description here

    2 回复  |  直到 8 年前
        1
  •  2
  •   lagbox    8 年前

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

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

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

        2
  •  1
  •   user259752    8 年前

    修复

    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);
                    }
                }
            });
        }
    }
    
    推荐文章