【问题标题】:How to observe all models implementing an interface in Laravel 5.1?如何观察在 Laravel 5.1 中实现接口的所有模型?
【发布时间】:2016-03-06 16:57:07
【问题描述】:

我有一个扩展了 Eloquent 模型的审计类...

class Audit extends Model {
}

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

interface IAuditiable {
    public function audit();
}

我有一个 trait 可以满足接口并定义模型和审计之间的关系...

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

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

class Post extends Model implements IAuditable {
    use Auditable;
}

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

但是,最终会有许多模型使用实现 IAuditable 并使用 Auditable 特征。

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

【问题讨论】:

  • 你考虑过类似github.com/VentureCraft/revisionable 的东西吗?
  • 您可以制作自己的模型合约,实现已保存函数的附加功能,并让您的可审计模型扩展可审计模型
  • 是的,@Brynn 这似乎是目前唯一的解决方案。这就是 Venture Craft 的可修改解决方案。我对此不感兴趣,因为 1)我不希望额外继承增加复杂性 2)将来可能会有其他更新需要扩展保存的方法。

标签: php laravel laravel-5.1


【解决方案1】:

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

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

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

编辑:刚刚注意到这个问题是在大约两年前提出的。不过,希望这对某人有所帮助:)

【讨论】:

  • 帮帮我!谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2017-05-04
相关资源
最近更新 更多