2012-11-22 94 views

回答

8

實際上,Laravel在保存|更新|創建一些模型之前有真正的回調。檢查:

https://github.com/laravel/laravel/blob/3.0/laravel/database/eloquent/model.php#L362

像保存,保存事件監聽是真正的回調

$this->fire_event('saving'); 

$this->fire_event('saved'); 

我們如何能與這項工作?只是把它分配給此事件監聽例如:

\Laravel\Event::listen('eloquent.saving: User', function($user){ 
    $user->saving();//your event or model function 
}); 
+5

這不再是Laravel 4的最佳答案。http://laravel.com/docs/5.0/eloquent#model-events – Lotus

+0

最完整的文檔解釋模型事件是在這裏的主文檔中找到:https://laravel.com/docs/master/eloquent#events –

58

實現保存回調之前和之後的最佳方式是擴展save()函數。

這裏有一個簡單的例子

class Page extends Eloquent { 

    public function save(array $options = []) 
    { 
     // before save code 
     parent::save(); 
     // after save code 
    } 
} 

所以,現在當您保存頁面對象及其save()函數被調用其中包括parent::save()功能;

$page = new Page; 
$page->title = 'My Title'; 
$page->save(); 
+1

這是使得它的功能就像CakePHP的afterSave()和beforeSave)的最佳解決方案(。或者,如果要全局應用save()方法,則會有事件掛鉤。 –

+3

由於您沒有在數據庫事務中操作,因此您需要非常小心。父::保存();完成數據庫轉換。如果您在前後保存,它們也將是完整的交易。如果您需要確保所有的保存都發生或失敗,那麼您需要將它們包裝在一個DB :: transaction()中。 –

+1

在Laravel 4中執行此操作的最佳方法是向用戶觀察者:http://laravel.com/docs/eloquent#model-events –

0

如果要對模型本身控制,你可以重寫保存功能和之前或之後__parent::save()把你的代碼。

否則,每個Eloquent模型在保存之前都會觸發一個事件。

當Eloquent保存模型時也會觸發兩個事件。

「eloquent.saving:model_name」或「eloquent.saved:model_name」。

http://laravel.com/docs/events#listening-to-events

+0

可以使用的事件的完整列表,http://stackoverflow.com/questions/13059744/where-can-i-get-a-complete-list-of- laravel-events-by-core-libaries – crynobone

22

添加在一個例子Laravel 4:

class Page extends Eloquent { 

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

     static::creating(function($page) 
     { 
      // do stuff 
     }); 

     static::updating(function($page) 
     { 
      // do stuff 
     }); 
    } 

} 
+2

我花了一些時間想知道爲什麼上述不起作用在我的測試。這裏有一個討論:https://github.com/laravel/framework/issues/1181。您可以將綁定放在global.php中來解決問題。 –

+1

我向觀察員建議這個答案http://stackoverflow.com/a/24773838/1275911 –