【问题标题】:Laravel 4.2 custom Observer EventLaravel 4.2 自定义观察者事件
【发布时间】:2014-12-12 18:25:13
【问题描述】:

我的 app 文件夹下有一个名为 observers 的目录,我会监听各种事件,例如 created 、 updated 等,然后我会处理它们! 我的观察者事件引导程序在我的模型引导功能中! 例如,我在模型文件夹下有用户模型,在观察者文件夹下有用户观察者! 现在我需要将我的特定事件添加到雄辩的观察者!考虑当我的用户表的一列(例如“启用”)发生更改时,我想要触发事件。 我知道我应该扩展 eloquent 模型并添加一个类似 userchangestate() 的函数 因为我已经查找了 Eloquent 模型,它对每个事件都有一个功能('creating' , 'created' , 'saving' , 'saved' ......) 但我仍然不确定如何处理它! 谢谢!

【问题讨论】:

  • 所以您正在寻找一种在特定列值发生变化时触发事件的方法,而不仅仅是模型正在保存/保存等?
  • 好的,请看下面的答案;-)

标签: events laravel laravel-4 observers


【解决方案1】:

我假设我的上述评论是真实的,我已多次阅读该问题以尝试理解它。

我会通过在保存事件期间检查属性是否为dirty(已更改)并在其新值已更改时触发自定义事件来做到这一点。

在您的观察者类依赖中注入调度程序(IoC 会自动为您执行此操作)。

use Illuminate\Events\Dispatcher;

class UserObserver {

    protected $events;

    public function __construct(Dispatcher $dispatcher)
    {
        $this->events = $dispatcher;

        // Set up a listener for your modified event to run a method
        // on this class
        $this->events->listen('myevent.modified', [$this, 'changeState']);
    }

    public function saving($model)
    {
        if ($model->isDirty(['attribute'])
        {
            $this->events->fire('myevent.modified', [$model->attribute]);
        }
    }

    public function changeState($value)
    {
        // Handle your event here
    }
}

您现在可以使用签名myevent.modified 在任何地方收听此事件。

编辑在构造函数的监听器中添加,并将事件回调推送到changeState方法。

如果您不需要触发事件,您可以直接推送结果。

use Illuminate\Events\Dispatcher;

class UserObserver {

    protected $events;

    public function __construct(Dispatcher $dispatcher)
    {
        $this->events = $dispatcher;
    }

    public function saving($model)
    {
        if ($model->isDirty(['attribute'])
        {
            $this->changeState($model->attribute);
        }
    }

    public function changeState($value)
    {
        // Handle your event here
    }
}

【讨论】:

  • 感谢大卫!给我你的时间!非常感谢!首先我遇到了一个错误:传递给 NewsObserver::__construct() 的参数 1 必须是 Illuminate\Events\Dispatch 的一个实例,当我通过 Dispatch 对象在启动函数中观察我的模型中的函数时它起作用了!我只希望我的观察者类有一个名为“changestate”的方法,就像“created”、“saved”、.. 它捕获事件并处理它!可能吗??再次感谢!
  • 当然可以,在上面的例子中添加了这样做的方式!
  • 这对我来说就像一个魅力!非常感谢 !当然你对 laravel 很了解。我应该在哪里阅读有关 laravel 调度程序的信息??
  • 太。我刚刚阅读了源代码。调度程序类是静态面临的“事件”所使用的,因此“事件::fire('blah')”正在使用调度程序。也许考虑接受我的答案? ;-)
【解决方案2】:

感谢大卫,我得到了答案:

<?php

use Illuminate\Events\Dispatcher;

class News extends Magniloquent {

    protected $fillable = [];
    public $table = 'news';

    public static function boot()
    {
        parent::boot();

        News::observe(new NewsObserver(new Dispatcher));
    }
}

我的观察者如下:

<?php
use Illuminate\Events\Dispatcher;

class NewsObserver
{
    protected $events;

    public function __construct(Dispatcher $dispatcher)
    {
        $this->events = $dispatcher;
    }

    public function saving($model)
    {
        if ($model->isDirty(['publish']))
        {
            $this->changeState($model->publish);
        }
    }   

    public function changeState($value)
    {
       //do my stuff
    }
}

这对我有用!

当我的news 表中的publish 列发生变化时,NewsObserver::changeState() 事件会自动触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 2019-10-27
    • 2018-10-05
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多