[英]Working with global events for models, on Laravel
基本上这就是我需要的:如果在我的项目中创建 , 更新或删除了任何模型行,则需要调用回调函数来处理该模型行。 我将使用它在其他模型中创建一个变更日志,它不会触发此全局事件以避免循环。
我尝试将其设置为:
Model::creating($callback);
但这没有用。 仅当我直接将其设置为我拥有的所有模型时,它才起作用。 这很糟糕,因为我需要一对一地指定。 如果创建一个新的,则需要手动指定。 例:
User::creating($callback);
Company::creating($callback);
...
任何更改将记录在另一个称为Log
模型上。 它不会触发此$callback
,因为它将在其他模型中的每次更改都在表logs
(由Log
管理)上注册。 就像是:
$user = new User;
$user->name = "John";
$user->age = 18;
$user->save();
$user->name = "John Doe";
$user->save();
$user->delete();
$user->restore();
$user->forceDelete();
我将注册类似:
id | object_type | object_id | event_type | object_data
.. App\User 1 created { name: John, age: 18 }
.. App\User 1 updated { name: John Doe }
.. App\User 1 trashed null
.. App\User 1 restored null
.. App\User 1 removed null
所有Eloquent模型事件的格式均为eloquent.event:ClassName
。
您可以订阅eloquent.*
事件。 Event :: listen('eloquent。*',function($ model){});
然后,您可以检查当前模型是否为日志模型(在这种情况下,您将直接return true
以避免无限递归),否则,将更改保存到日志模型中。
使用Laravel 5.1
BaseTrait
特质:
trait BaseTrait
{
public static function bootBaseTrait()
{
static:creating(function($item) {
....
});
static:updating(function($item) {
....
});
}
// It binds the events in bootBaseTrait to any subclass
// Base run first, then run your subclass's events if you defined on the subclass
}
Base
型号:
use XX\XX\BaseTrait;
use Illuminate\Database\Eloquent\Model;
class Base extends Model
{
use BaseTrait;
}
XXX
型号:
use XX\XX\Base;
class XXX extends Base
{
}
这是如何运作的?
您可以看到/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
protected static function bootTraits()
使用特征时,该方法尝试调用bootTraitName
!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.