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

jon*_*s51 6 php laravel laravel-5.1

我有一个审计类,它扩展了雄辩模型......

class Audit extends Model {
}
Run Code Online (Sandbox Code Playgroud)

我有一个可审计的界面...

interface IAuditiable {
    public function audit();
}
Run Code Online (Sandbox Code Playgroud)

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

trait Auditable {
    public function audit(){
        return $this->hasMany('Audit');
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class Post extends Model implements IAuditable {
    use Auditable;
}
Run Code Online (Sandbox Code Playgroud)

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

然而,最终会有很多模型使用实现IAuditable和使用Auditabletrait。

所以,我的问题是,是否有可能实现一个观察者,它可以为任何IAuditableLaravel 5.1 中实现接口的模型获取所有“保存”的事件?

小智 5

您可以尝试挂钩雄辩的事件。在服务提供者中做这样的事情:

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

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

编辑:刚刚注意到这个问题是在大约两年前提出的。希望这可以帮助某人,尽管 :)