Event và listener trong Laravel, cách tạo và quản lý cơ bản nhất
Trong Laravel, Event và Listener là hai khái niệm quan trọng trong việc quản lý sự kiện và xử lý chúng trong ứng dụng web. Event là một sự kiện xảy ra trong hệ thống, ví dụ như khi người dùng đăng nhập thành công hoặc khi có một đơn hàng mới được tạo. Listener là một đoạn mã được thực thi khi một sự kiện được kích hoạt.
Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo và quản lý Event và Listener trong Laravel. Đầu tiên, chúng ta sẽ tìm hiểu về cách tạo Event và Listener, sau đó sẽ đi vào chi tiết cách sử dụng chúng để xử lý các sự kiện trong Laravel. Bài viết sẽ bao gồm các ví dụ cụ thể và hướng dẫn cách sử dụng các công cụ và tính năng trong Laravel để quản lý Event và Listener.
I. Event trong Laravel là gì ?
Event là một thành phần quan trọng của hệ thống sự kiện (event system). Event (hay còn gọi là sự kiện) được sử dụng để thông báo về một hành động nào đó trong ứng dụng và cho phép các phần khác của ứng dụng đăng ký và phản ứng với sự kiện này.
Ví dụ, khi một người dùng đăng ký tài khoản trên trang web của bạn, bạn có thể tạo một sự kiện "UserRegistered" để đăng ký người dùng mới này. Các thành phần khác trong ứng dụng của bạn có thể đăng ký với sự kiện này và thực hiện một số hành động sau khi sự kiện được kích hoạt, ví dụ như gửi email xác nhận, lưu thông tin người dùng vào cơ sở dữ liệu, v.v.
Bài viết này được đăng tại [free tuts .net]
Event cũng được sử dụng để giảm sự phụ thuộc giữa các thành phần trong ứng dụng của bạn. Thay vì phải gọi trực tiếp các thành phần khác trong ứng dụng, các thành phần này có thể đăng ký với sự kiện và phản ứng với nó khi sự kiện được kích hoạt.
Dưới đây là một ví dụ về sử dụng Event trong Laravel:
Ta có một sự kiện là "UserRegistered" để xử lý khi người dùng đăng ký tài khoản mới:
Đầu tiên, ta cần đăng ký sự kiện trong tệp EventServiceProvider.php bằng cách thêm mã sau:
protected $listen = [ 'App\Events\UserRegistered' => [ 'App\Listeners\SendWelcomeEmail', ], ];
Tiếp theo, ta cần tạo một lớp sự kiện UserRegistered trong thư mục app/Events với mã như sau:
namespace App\Events; use App\Models\User; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class UserRegistered { use Dispatchable, SerializesModels; public $user; public function __construct(User $user) { $this->user = $user; } };
Lớp sự kiện này chứa thông tin về người dùng được đăng ký.
Sau đó, ta cần tạo một lớp SendWelcomeEmail trong thư mục app/Listeners để xử lý sự kiện UserRegistered:
namespace App\Listeners; use App\Events\UserRegistered; use App\Mail\WelcomeEmail; use Illuminate\Support\Facades\Mail; class SendWelcomeEmail { public function handle(UserRegistered $event) { Mail::to($event->user->email)->send(new WelcomeEmail($event->user)); } }
Lớp này gửi email chào mừng cho người dùng đăng ký mới.
Cuối cùng, ta cần phát ra sự kiện UserRegistered khi có người dùng đăng ký mới bằng cách thêm mã sau vào phương thức xử lý đăng ký trong bộ điều khiển:
use App\Events\UserRegistered; use App\Models\User; public function register(Request $request) { // Xử lý đăng ký người dùng $user = new User([ 'name' => $request->name, 'email' => $request->email, 'password' => bcrypt($request->password), ]); $user->save(); // Phát ra sự kiện UserRegistered event(new UserRegistered($user)); // Chuyển hướng đến trang đăng nhập return redirect('/login'); }
Như vậy, khi có người dùng đăng ký tài khoản mới, sự kiện UserRegistered sẽ được phát ra, và lớp SendWelcomeEmail sẽ được gọi để gửi email chào mừng đến người dùng mới đăng ký.
Trong Laravel, Event được quản lý bởi Service Container của framework. Service Container cung cấp một cơ chế để đăng ký các listener với event tương ứng, và khi sự kiện được kích hoạt, Service Container sẽ tự động gọi các listener tương ứng và xử lý sự kiện.
II. Tạo một Event trong Laravel
Bước 1: Tạo sự kiện
Để tạo sự kiện, hãy chạy lệnh make:event trong terminal của bạn:
php artisan make:event OrderShipped
Lệnh trên sẽ tạo ra một lớp sự kiện mới có tên OrderShipped. Trong lớp này, bạn có thể định nghĩa các thuộc tính và phương thức để sử dụng trong các listener của sự kiện này.
Ví dụ:
namespace App\Events; use App\Models\Order; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class OrderShipped { use Dispatchable, SerializesModels; public $order; public function __construct(Order $order) { $this->order = $order; } }
Lớp sự kiện trên đại diện cho việc một đơn hàng đã được gửi đi. Nó có một thuộc tính $order để lưu trữ thông tin về đơn hàng và một constructor để khởi tạo đối tượng.
Bước 2: Tạo listener
Sau khi bạn đã tạo sự kiện, bạn có thể tạo một listener để xử lý sự kiện đó. Chạy lệnh make:listener để tạo lớp listener:
php artisan make:listener SendShipmentNotification --event=OrderShipped
Lệnh trên sẽ tạo ra một lớp listener mới với tên SendShipmentNotification. Trong lớp này, bạn có thể định nghĩa phương thức handle để xử lý sự kiện.
Ví dụ:
namespace App\Listeners; use App\Events\OrderShipped; use Illuminate\Contracts\Queue\ShouldQueue; class SendShipmentNotification implements ShouldQueue { public function handle(OrderShipped $event) { // Gửi email thông báo đơn hàng đã được gửi đi } }
Listener trên được sử dụng để gửi email thông báo cho khách hàng khi đơn hàng của họ đã được gửi đi.
Bước 3: Đăng ký listener với sự kiện
Cuối cùng, bạn cần đăng ký listener với sự kiện để xử lý sự kiện. Bạn có thể đăng ký listener trong file EventServiceProvider.php.
Ví dụ:
protected $listen = [ OrderShipped::class => [ SendShipmentNotification::class, ], ];
Trong ví dụ trên Listener SendShipmentNotification đã được đăng ký với sự kiện OrderShipped. Khi sự kiện OrderShipped được kích hoạt (thông qua phương thức $event->dispatch()), listener SendShipmentNotification sẽ được gọi và phương thức handle trong listener này sẽ được thực thi.
Bạn có thể kích hoạt sự kiện OrderShipped bằng cách sử dụng phương thức dispatch như sau:
use App\Events\OrderShipped; use App\Models\Order; $order = Order::find(1); OrderShipped::dispatch($order);
Khi phương thức dispatch được gọi, sự kiện OrderShipped sẽ được kích hoạt và các listener đăng ký với sự kiện này sẽ được thực thi.
Nếu bạn muốn xử lý sự kiện bất đồng bộ, bạn có thể sử dụng interface ShouldQueue trong lớp sự kiện và Laravel sẽ tự động xử lý sự kiện bằng một hàng đợi, ví dụ:
class OrderShipped implements ShouldQueue { // ... }
Trong ví dụ này, lớp sự kiện OrderShipped được thiết lập để xử lý bất đồng bộ.
Đó là cách bạn tạo và quản lý sự kiện và listener trong Laravel. Bạn có thể sử dụng Event để theo dõi và phản hồi các hoạt động của ứng dụng của bạn, tăng tính bảo mật và dễ dàng bảo trì ứng dụng của bạn.
Bước 4: Kích hoạt sự kiện
Sử dụng phương thức event() để kích hoạt sự kiện và truyền các tham số cần thiết.
Ví dụ:
$user = Auth::user(); event(new UserLoggedIn($user));
Trong đoạn mã trên, Auth::user() được sử dụng để lấy thông tin về người dùng đăng nhập. Sau đó, sự kiện UserLoggedIn được kích hoạt và truyền vào thông tin về người dùng đăng nhập.
Sau khi sự kiện được kích hoạt, lớp listener LogUserLogin sẽ được gọi để xử lý sự kiện. Trong ví dụ này, lớp listener sẽ ghi log về việc người dùng đăng nhập vào hệ thống.
III. Listener trong Laravel
Listener trong Laravel là một lớp được sử dụng để xử lý các sự kiện được kích hoạt trong ứng dụng. Listener đóng vai trò như một bộ lắng nghe cho các sự kiện và thực hiện các hành động tương ứng khi sự kiện được kích hoạt.
Một listener thường bao gồm một phương thức handle() để xử lý sự kiện. Phương thức handle() nhận vào đối số là một đối tượng sự kiện và sử dụng các thuộc tính của đối tượng sự kiện để thực hiện các hành động tương ứng.
Ví dụ, trong một ứng dụng Laravel, bạn muốn ghi log lại khi có người dùng đăng nhập vào hệ thống. Để làm điều đó, bạn có thể tạo một lớp sự kiện UserLoggedIn để đại diện cho sự kiện đăng nhập thành công. Sau đó, bạn có thể tạo một listener LogUserLogin để ghi log về việc đăng nhập của người dùng.
// UserLoggedIn.php namespace App\Events; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class UserLoggedIn { use Dispatchable, SerializesModels; public $user; public function __construct($user) { $this->user = $user; } }
// LogUserLogin.php namespace App\Listeners; use App\Events\UserLoggedIn; use Illuminate\Support\Facades\Log; class LogUserLogin { public function handle(UserLoggedIn $event) { $user = $event->user; Log::info("User {$user->name} logged in"); } }
Trong ví dụ này, listener LogUserLogin chứa phương thức handle() để xử lý sự kiện UserLoggedIn. Phương thức handle() nhận vào một đối tượng sự kiện UserLoggedIn và sử dụng thuộc tính user của đối tượng sự kiện để ghi log về việc đăng nhập của người dùng.
Để kích hoạt sự kiện, bạn có thể sử dụng phương thức event() trong Laravel. Ví dụ:
$user = Auth::user(); event(new UserLoggedIn($user));
Sau khi sự kiện được kích hoạt, listener LogUserLogin sẽ được gọi để xử lý sự kiện. Trong ví dụ này, lớp listener sẽ ghi log về việc người dùng đăng nhập vào hệ thống.
Mối liên hệ giữa Event và Listener trong Laravel
Trong Laravel, Event và Listener có mối liên hệ chặt chẽ với nhau.
Event là một sự kiện trong ứng dụng, ví dụ như khi người dùng đăng ký thành công tài khoản, bạn có thể tạo một sự kiện "UserRegistered" để xử lý sự kiện này.
Listener là một lớp được đăng ký với sự kiện tương ứng và được sử dụng để xử lý các hành động nào đó khi sự kiện được kích hoạt. Ví dụ, khi sự kiện "UserRegistered" được kích hoạt, lớp lắng nghe tương ứng với sự kiện này có thể gửi email xác nhận cho người dùng, hoặc lưu thông tin người dùng vào một bảng trong cơ sở dữ liệu.
Mối liên kết giữa event và listener trong Laravel được quản lý bởi Service Container, một thành phần chính của framework. Service Container cung cấp một cơ chế để đăng ký listener với event tương ứng, và khi sự kiện được kích hoạt, Service Container sẽ tự động khởi tạo các listener tương ứng và gọi các phương thức xử lý sự kiện.
Vì vậy, khi bạn đăng ký một listener với một event, bạn đang khai báo rằng "khi sự kiện này xảy ra, hãy xử lý nó bằng cách gọi lớp lắng nghe này". Mối quan hệ này giúp cho ứng dụng của bạn trở nên dễ dàng quản lý, mở rộng và bảo trì hơn.
Tổng kết
Như vậy, trong bài viết này chúng ta đã tìm hiểu về cách tạo và quản lý Event và Listener trong Laravel. Event và Listener là hai khái niệm quan trọng trong việc quản lý sự kiện và xử lý chúng trong ứng dụng web.
Chúng ta đã tìm hiểu cách tạo Event và Listener, sau đó đi vào chi tiết cách sử dụng chúng để xử lý các sự kiện trong Laravel. Bài viết cũng bao gồm các ví dụ cụ thể và hướng dẫn cách sử dụng các công cụ và tính năng trong Laravel để quản lý Event và Listener.
Việc sử dụng Event và Listener giúp cho việc xử lý các sự kiện trở nên dễ dàng hơn, giảm thiểu các khối lượng code không cần thiết và tăng tính bảo mật cho ứng dụng web.
Hy vọng bài viết này sẽ giúp các bạn hiểu rõ hơn về cách tạo và quản lý Event và Listener trong Laravel, từ đó giúp cho việc xử lý sự kiện trong ứng dụng trở nên thuận tiện hơn.
# Top 4 bài tutorials có liên quan đến Event và Listener bạn nên tham khảo
1. Nếu bạn là người đam mê tìm tòi và học hỏi sẽ không thể bỏ qua bài hướng dẫn của Laravel
Link bài viết : https://laravel.com/docs/9.x/events
2. Ngoài ra bạn có thể tham khảo thêm bài nói về Event và Listeners cơ bản
Link bài viết : https://viblo.asia/p/co-ban-ve-events-listeners-laravel-1Je5EXG1lnL
3. Bài này cho ta biết cách tạo ra một Event thì bài dưới đây sẽ giúp biết được cách sử dụng của nó
Link bài viết : https://freetuts.net/su-dung-event-trong-laravel-364.html
4. Nếu bạn đã đọc qua 4 bài trên thì nên đọc tổng quan về nó 1 lần nữa nhé rất bổ ích đó
Link bài viết :https://hoclaravel.net/tong-quan/quan-ly-su-kien-trong-ung-dung-voi-laravel-event/