2012-11-22 35 views

Trả lời

8

Thực ra, Laravel có gọi lại thực sự trước | sau khi lưu | cập nhật | tạo một số mô hình. kiểm tra này:

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

các EventListener như lưu lại và tiết kiệm là những callbacks thực

$this->fire_event('saving'); 

$this->fire_event('saved'); 

thế nào chúng ta có thể làm việc với điều đó? chỉ gán nó vào ví dụ eventListener này:

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

Đây không còn là câu trả lời hay nhất với Laravel 4. http://laravel.com/docs/5.0/eloquent#model-events – Lotus

+0

Tài liệu hoàn chỉnh nhất giải thích các sự kiện mô hình được tìm thấy trong tài liệu chính tại đây: https://laravel.com/docs/master/eloquent#events –

58

Cách tốt nhất để đạt được trước và sau khi lưu các cuộc gọi lại để mở rộng hàm save().

Dưới đây là một ví dụ nhanh

class Page extends Eloquent { 

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

Vì vậy, bây giờ khi bạn lưu một trang đối tượng của nó save() chức năng được gọi bao gồm các chức năng parent::save();

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

Đây là giải pháp tốt nhất để làm cho nó hoạt động như afterSave CakePHP của() và beforeSave(). Ngoài ra, có móc sự kiện trong phương thức save() nếu bạn muốn áp dụng nó trên toàn cầu. –

+3

bạn cần phải rất cẩn thận ở đây vì bạn không hoạt động trong một giao dịch cơ sở dữ liệu. parent :: save(); hoàn thành quá trình chuyển đổi cơ sở dữ liệu. Nếu bạn đang tiết kiệm trước và sau, họ cũng sẽ hoàn tất giao dịch. Nếu bạn cần phải chắc chắn rằng tất cả các lưu xảy ra hoặc thất bại, sau đó bạn cần phải bọc chúng trong một giao dịch DB ::(). –

+1

cách tốt nhất để làm điều đó trong Laravel 4 là người dùng quan sát: http://laravel.com/docs/eloquent#model-events –

0

Nếu bạn muốn kiểm soát chính mô hình, bạn có thể ghi đè chức năng lưu và đặt mã trước hoặc sau __parent::save().

Nếu không, có sự kiện được kích hoạt theo từng mô hình Eloquent trước khi nó tự lưu.

Ngoài ra còn có hai sự kiện được kích hoạt khi Eloquent lưu mô hình.

"eloquent.saving: model_name" hoặc "eloquent.saved: model_name".

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

+0

Danh sách đầy đủ của sự kiện bạn có thể sử dụng, http://stackoverflow.com/questions/13059744/where-can-i-get-a-complete-list-of- laravel-events-fired-by-the-core-libaries – crynobone

6

Mặc dù câu hỏi này đã được đánh dấu 'chấp nhận' - tôi thêm một câu trả lời được cập nhật mới cho Laravel 4.

Beta 4 of Laravel 4 has just introduced hook events for Eloquent save events - vì vậy bạn không cần phải mở rộng cốt lõi nữa:

Đã thêm mô hình :: tạo (Đóng) và Mô hình :: cập nhật (Đóng) các phương pháp để gắn vào các sự kiện lưu trữ Eloquent. Cảm ơn Phil Sturgeon vì cuối cùng đã gây áp lực cho tôi khi làm điều này ... :)

22

Thêm một ví dụ cho 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

Tôi đã dành thời gian tự hỏi tại sao những điều trên không hiệu quả trong các bài kiểm tra của tôi. Có một cuộc thảo luận về điều đó ở đây: https://github.com/laravel/framework/issues/1181. Bạn có thể đặt ràng buộc trong global.php để khắc phục sự cố. –

+1

Tôi đề xuất câu trả lời này cho các nhà quan sát http://stackoverflow.com/a/24773838/1275911 –

Các vấn đề liên quan