如何观察在Laravel 5.1中实现一个接口的所有模型?

7

我有一个审计类,它扩展了Eloquent Model...

class Audit extends Model {
}

我有一个可审计的接口...

interface IAuditiable {
    public function audit();
}

我有一个特性,它满足接口并定义了模型和审计之间的关系...

trait Auditable {
    public function audit(){
        return $this->hasMany('Audit');
    }
}

我有一个模型,它继承了Eloquent Model并实现了接口,使用了trait...

class Post extends Model implements IAuditable {
    use Auditable;
}

我想在那里添加功能,在创建或更新Post模型时,可以“创建”或“更新”审核。 我通过在Post上注册观察者来解决这个问题,该观察者会捕获“saved”事件并添加新的审核。
然而,最终会有许多使用实现IAuditable并使用Auditable trait的模型。
因此,我的问题是,在Laravel 5.1中是否可能实现一个观察者,该观察者将捕获实现IAuditable接口的任何模型的所有“saved”事件?

你考虑过类似于 https://github.com/VentureCraft/revisionable 这样的东西吗? - user2094178
你可以创建自己的模型合同,实现保存功能的附加功能,并让你的可审计模型扩展AuditableModel。 - Brynn Bateman
是的,@Brynn 目前看来似乎只有这个解决方案。这是 Venture Craft 在他们的可修订解决方案中提出的。我不太喜欢这个方案,因为 1)我不想增加额外继承的复杂性,2)未来可能会有其他更新需要扩展保存方法。 - jonadams51
1个回答

6

您可以尝试挂钩Eloquent事件。在服务提供者中执行以下操作:

Event::listen(['eloquent.created: *', 'eloquent.updated: *'], function($model) {
    // Check if the model implements your interface (could use class_implements(...)  
});

我曾经需要做与你所需相似的事情。这种解决方案并不完美,因为您会捕获来自每个模型的事件,但它已足够好用了。
编辑:刚注意到这个问题是两年前提出的。但希望这对某人有所帮助 :)

帮了我个大忙!谢谢 :) - Pepijn Olivier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接