繁体   English   中英

在Laravel上处理模型的全局事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM