【问题标题】:Laravel 4 how to listen to a model event?Laravel 4 如何监听模型事件?
【发布时间】:2016-12-25 13:53:18
【问题描述】:

我想要一个与模型事件 updating 绑定的事件侦听器。
比如帖子更新后,有一个alert通知帖子标题更新了,如何写一个事件监听器来进行通知(将帖子标题的值传递给监听器?

【问题讨论】:

  • 我想你已经阅读了有关Events的文档?
  • 是的,我不确定应该使用什么名称?在自定义事件中,我们可以使用Event:fire('event_name',array('value')),然后是Event:listen('event_name',function($param1){..}) 那么我应该使用Event:fire('project::updating',array($project->title)) 吗?
  • 我尝试了 Event:listen('event_name',function($param1) 与模型事件,但它们似乎没有工作。希望这在文档中更清楚一点!我会假设这个也会起作用的。

标签: laravel laravel-4 eloquent


【解决方案1】:

这篇文章: http://driesvints.com/blog/using-laravel-4-model-events/

向您展示如何使用模型内的“boot()”静态函数设置事件侦听器:

class Post extends eloquent {
    public static function boot()
    {
        parent::boot();

        static::creating(function($post)
        {
            $post->created_by = Auth::user()->id;
            $post->updated_by = Auth::user()->id;
        });

        static::updating(function($post)
        {
            $post->updated_by = Auth::user()->id;
        });
    }
}

@phill-sparks 在他的回答中分享的事件列表可以应用于各个模块。

【讨论】:

  • 非常方便的方法来自动化一点模型。谢谢。
  • 不错!比为了注册这些就扔掉一万个服务提供商要方便得多……
【解决方案2】:

文档简要提到了Model Events。它们在模型上都有一个辅助函数,所以你不需要知道它们是如何构造的。

Eloquent 模型触发多个事件,允许您使用以下方法连接到模型生命周期中的各个点:创建、创建、更新、更新、保存、保存、删除、删除。如果创建、更新、保存或删除事件返回 false,则该操作将被取消。


Project::creating(function($project) { }); // *
Project::created(function($project) { });
Project::updating(function($project) { }); // *
Project::updated(function($project) { });
Project::saving(function($project) { });  // *
Project::saved(function($project) { });
Project::deleting(function($project) { }); // *
Project::deleted(function($project) { });

如果您从标记为* 的函数返回false,那么它们将取消操作。


更多细节,你可以浏览Illuminate/Database/Eloquent/Model,你会发现里面的所有事件,寻找static::registerModelEvent$this->fireModelEvent的用法。

Eloquent 模型上的事件结构为 eloquent.{$event}: {$class},并将模型实例作为参数传递。

【讨论】:

  • 谢谢!我将有Post::updating(function($post) {....$post->title.... }); 来完成通知。
【解决方案3】:

我之所以坚持这一点,是因为我认为订阅默认模型事件,如 Event:listen('user.created',function($user) 会起作用(正如我在评论中所说)。到目前为止,我已经看到这些选项在默认模型用户创建事件的示例中起作用:

//This will work in general, but not in the start.php file
User::created(function($user).... 
//this will work in the start.php file
Event::listen('eloquent.created: User', function($user).... 

【讨论】:

  • 正是我想要的!我使用事件订阅者来保持我的课程精简。
【解决方案4】:
Event::listen('eloquent.created: ModelName', function(ModelName $model)   {
    //...
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2020-08-28
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多