Observer Events trong Laravel

1. Giới thiệu

Observer Events trong Laravel là một tính năng cho phép bạn theo dõi các sự kiện xảy ra trong ứng dụng của mình. Bằng cách sử dụng Observer Events, bạn có thể ghi lại các hoạt động của người dùng, như đăng ký, đăng nhập, tạo, cập nhật hoặc xóa các bản ghi trong cơ sở dữ liệu. Điều này cho phép bạn dễ dàng quản lý, phân tích và giám sát các sự kiện quan trọng của ứng dụng của mình. Observer Events là một phần quan trọng trong kiến trúc MVC (Model-View-Controller) của Laravel và được sử dụng rộng rãi trong các dự án Laravel.

2. Laravel Model Events

Eloquent đã cung cấp các sự kiện để bạn có thể hook vào một số thời điểm trong một vòng đời của nó:

  • retrieved : sau khi một bản ghi đã được lấy từ database.
  • creating : trước khi một bản ghi đã được tạo.
  • created : sau khi một bản ghi đã được tạo.
  • updating : trước khi một bản ghi được cập nhật.
  • updated : sau khi một bản ghi đã được cập nhật.
  • saving : trước khi một bản ghi được lưu (được tạo hoặc cập nhật).
  • saved : sau khi bản ghi đã được lưu (được tạo hoặc cập nhật).
  • deleting : trước khi một bản ghi bị xóa hoặc xóa mềm.
  • deleted : sau khi một bản ghi đã bị xóa hoặc xóa mềm.
  • restoring : trước khi bản ghi bị xóa mềm sẽ được khôi phục.
  • restored : sau khi bản ghi bị xóa mềm đã được khôi phục.

3. Laravel Model Observers

Giả sử bạn có 1 chuỗi các hành động diễn ra lần lượt và phụ thuộc vào nhau ví dụ như: khi bạn xóa 1 bài post thì bạn đồng thời muốn xóa tất cả các comment của nó, hay khi đăng ký thành công một account sẽ tự động gửi mail đến cho người đăng ký nè,... Mặc dù bạn có thể viết toàn bộ logic code đó trong Controller. Nhưng hôm nay mình xin giới thiệu với các bạn về Observer Events.

Bạn có thể dễ dàng create observer bằng cách run command:

php artisan make:observer NameObserver --model=NameModel

Trong ví dụ này mình sẽ tạo 1 PostObserver nhé:

php artisan make:observer PostObserver --model=Post

File PostObserver.php sẽ đc tạo ra ở thư mục app/Observers và sẽ có cấu trúc như sau:

Để có sử dụng ta phải đăng ký nó trong function boot() của AppServiceProvider

VD khi mình xóa 1 post thì mình sẽ xóa tất cả các comments của post đó nhé, ở đây mình sẽ sử dụng function deleting để hook sự kiện đó. Ở đây mình dùng HasMany relationship

Bây giờ thì mình có thể thêm deleting hook ở trong PostObserver để xóa tất cả các comment của bài viết đó.

Vậy là bạn đã xóa thành công tất cả các comments của bài Post đó.

4. Tài liệu tham khảo

https://viblo.asia/p/observer-events-trong-laravel-co-the-ban-chua-biet-gGJ59OQjZX2#_1-gioi-thieu-0
https://laravel.com/docs/6.x/eloquent#observers