2014-10-17 51 views
0

我有一个名为观察者的应用程序文件夹下有一个目录,我监听各种事件,比如创建,更新......以及我处理它们! 我的观察者事件bootstrap是在我的模型启动功能! 例如我有模型文件夹下的用户模型,我有观察者文件夹下的UserObserver! 现在我需要将我的具体事件添加到雄辩的观察者!考虑当我的用户表的“启用”之类的列发生改变时,我想要触发事件。 我知道我应该扩展雄辩的模型,并添加一个像userchangestate() 因为我已经查找了雄辩模型它有一个函数为每个事件('创建','创建','保存','保存',。 ...) 但我仍然不确定如何处理它! 谢谢!Laravel 4.2自定义观察器事件

+0

所以你正在寻找一种方式来触发一个事件,当一个特定的列值发生了变化,而不仅仅是模型保存/保存等? – 2014-10-17 09:42:35

+0

是axacltly谢谢 – mhndev 2014-10-17 10:07:05

+0

好吧,看到下面的答案;-) – 2014-10-17 10:07:36

回答

4

我假设我上面的评论是真的,阅读了很多次这个问题,试图理解它。

我会这样做,通过检查保存事件期间属性是否为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 
    } 
} 
+0

谢谢大卫!它工作只是我有错误是: – mhndev 2014-10-17 10:42:14

+0

Np,错误是什么? – 2014-10-17 10:43:25

+0

谢谢大卫!给我你的时间!非常appriciated!首先我有一个错误是:传递给NewsObserver :: __ construct()的参数1必须是Illuminate \ Events \ Dispatch的一个实例,当我在启动函数中传递Dispatch对象以观察模型中的函数时它工作正常!我只想让我的观察者类有一个名为“changestate”的方法,就像“创建”,“保存”,..捕获事件并处理它!可能吗??再次感谢! – mhndev 2014-10-17 10:49:45

0

感谢David我有我的回答是:

<?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()事件被自动触发。

相关问题