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