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


How to observe all models implementing an interface in Laravel 5.1?

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

class Audit extends Model {
}

我有一个可试听的界面。。。

interface IAuditiable {
    public function audit();
}

我有一个特点,它实现了接口,并定义了模型和审计之间的关系。。。

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

我有一个模型,它扩展了Eloquent模型,实现了接口并使用了特性。。。

class Post extends Model implements IAuditable {
    use Auditable;
}

我想在创建或更新Post模型时,将其中的功能添加到createupdate审计中。我通过在Post上注册一个观察者来解决这个问题,该观察者将捕获"已保存"事件并添加新的审计。

然而,最终会有许多模型使用实现IAuditable和使用Auditable特性。

因此,我的问题是,是否有可能实现一个观察器,该观察器将为任何在Laravel 5.1中实现IAuditable接口的模型拾取所有"保存"的事件?

您可以尝试连接到有说服力的事件中。在服务提供商中执行类似操作:

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

我不得不做一些与你想要做的非常相似的事情。这个解决方案并不完美,因为你可以从每个模型中捕捉事件,但它足够好。

编辑:我刚刚注意到这个问题是两年前提出的。不过,希望这能帮助到一些人:)