2014-10-17 50 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()事件被自動觸發。

相關問題