06/04/2021, 14:50

Sử dụng Event trong Laravel - Laravel tutorials

Trong bài này mình sẽ giới thiệu event, cách tạo event và bắt event trong Laravel. Không chỉ có Laravel mà ngay cả Zend, Phalcon đều có khái niệm này nên bạn có thể thấy tầm quan trọng của nó rồi đấy. 1. Event trong Laravel là gì? Event dịch theo đúng ý nghĩa của nó là "sự kiện", đây là một ...

Trong bài này mình sẽ giới thiệu event, cách tạo event và bắt event trong Laravel. Không chỉ có Laravel mà ngay cả Zend, Phalcon đều có khái niệm này nên bạn có thể thấy tầm quan trọng của nó rồi đấy.

1. Event trong Laravel là gì?

Event dịch theo đúng ý nghĩa của nó là "sự kiện", đây là một khái niệm khá quen thuộc khi bạn làm việc với javascript như sự kiện click, sự kiện hover, .. Nhưng chúng ta đang làm việc vói PHP cho nên về nguyên tắc sử dụng có sự khác biệt một chút. Để hiểu hơn thì mình lấy ví dụ đơn giản như sau, giả sử bạn có sự kiện sinh nhật, trong sự kiện này bạn có nhiều hành động để xây dựng nó như mời bạn bè đến chơi, mua bánh, mua kẹo, đặt tiệc tại nhà hàng, ... thì event trong laravel cũng tương tự, bạn có thể tạo ra 1 event và ở event đó bạn có thể có rất nhiều hành động.

Vẫn còn mơ hồ thì ta bắt tay vào tìm hiểu ngay nhé.

2. Cách sử dụng Event trong Laravel

Tạo Event trong laravel

Để tạo event bạn sử dụng đối tượng Event và gọi đến phương thức fire() qua cách gọi một phương thức tĩnh.

$response = Event::fire('event.name', array($value,$value2));

Trong đó:

  • event.name là tên Event
  • array($value,$value2) là các giá trị truyền vào cho event
Ví dụ: Tạo Event login và tham số truyền vào là username và password

$response = Event::fire('event.login', array('Zaidap.com.net','123456'));

Bắt Event trong laravel

Sau khi tạo event thì bạn có thể bắt event thông qua phương thức listen() trong đối tượng Event.

Event::listen('event.name', $callback);

Trong đó:

  • event.name là tên event mà ta đã tạo ở trên (sử dụng phương thức fire())
  • $callback có thể là function callback hoặc Class
Ví dụ: Bắt event login mà ta đã tạo ở trên

Trường hợp sử dụng function callback:

Event::listen('event.login', function($username, $password){
    // Handle the event...
});

Trường hợp sử dụng class callback:

Event::listen('event.login', 'LoginHandler ');
class LoginHandler {
    public function handle($value){
        // code here
    }
}

Như vậy trong lớp ban phải có phương thức handle() và phương thức này sẽ tự động được gọi.

Một Event có thể được bắt nhiều lần

Để bắt nhiều lần thì ta sử dụng phương thức listen() gọi tới nhiều lần.

Event::listen('event.name', $callback);
Event::listen('event.name', $callback2);
Event::listen('event.name', $callback3);
Event::listen('event.name', $callback4);
Event::listen('event.name', $callback5);
// ...

3. Ý nghĩa của Event trong Laravel

Để hiểu hơn thì mình xin lấy ví dụ như sau. Giả sử web bạn có chức năng đăng ký đăng nhập tài khoản, ban đầu bạn chỉ cần đăng ký rồi đăng nhập là được, một thời gian sau bạn cần đăng ký và gửi mail kích hoạt, thời gian sau nữa bạn muốn đăng ký từ vào ngày chẵn thì tặng điểm thưởng, thời gian sau nữa bạn lại muốn ghi lại thời gian đăng nhập. Như vậy chẳng lẽ mỗi lần muốn thêm bạn lại vào code lần mò và sửa lại và thêm hay sao, như thế thì chẳng hay chút nào mà còn cực nữa.

Laravel đưa ra event là một giải pháp tốt nhất để giải quyết vấn đề này. Đăng ký bạn chỉ cần tạo sự kiện user.created, đăng nhập bạn tạo sự kiện user.logged và cứ như thế sau này bạn muốn tác động vào giai đoạn đăng ký thì bắt event user.created và làm những việc mình muốn mà không cần can thiệp tới code cũ.

Vấn đề nữa đặt ra là vậy thì đặt code bắt sự kiện ở đâu? Nếu bạn làm nhiều rồi sẽ tự thấy rằng nên đặt ở đâu, nhưng ở đây bạn nào chưa biết thì mình gợi ý cho một cách đặt:

Bạn tạo thư mục app/Projects/Events/Users/ và tạo file EventServiceProvider.php trong thư mục app/Projects/Events/ với nội dung như sau:

<?php
namespace ProjectsEvents;

use IlluminateSupportServiceProvider;
class EventServiceProvider extends ServiceProvider {
	public function register()
	{
		//đăng ký class bắt event, ví dụ $this->app->events->subscribe(new UserEventHandler);
	}
}

Bạn mở file composer.json bổ sung thêm nội dung sau:

"psr-4":{
	"Projects\Events\" : "app/Projects/Events"
}

Đây là hình tham khảo vị trí bổ sung:

su dung event trong laravel PNG

Sau đó bạn mở command và chạy lệnh: composer dump-auto. (xem thêm về autoload psr4 tại http://www.php-fig.org/psr/psr-4/)

Bạn mở file app/config/app.php và thêm đoạn code sau vào vị trí cuối cùng của providers

'ProjectsEventsEventServiceProvider',

Như vậy là đã xong việc autoload event theo app của bạn, và việc này chỉ cần làm một lần đầu tiên.

Tiếp theo là đăng ký các class event listen vào provider, ở đây mình sẽ lấy ví dụ về việc tạo class bắt sự kiện event user.ceated và sẽ gửi mail kích hoạt.

Bạn tạo hai files UserEventHandler.phpSendMailActive.php trong thư mục Users, sau đó tạo hai class UserEventHandlerSendMailActive tương đương với tên từng file:

<?php namespace ProjectsEventsUsers;
class UserEventHandler{
   	public function subscribe($events){
      		//Lưu ý: để sử dụng ::class thì bạn phải sử dụng php 5.5 trở lên
      		$events->listen('user.created', SendMailActive::class);
      		//Nếu sử dụng php 5.4
      		$events->listen('user.created', 'ProjectsEventsUsersSendMailActive');
   	}
}

<?php
namespace ProjectsEventsUsers;
use User;
class SendMailActive{
	public function handle( $value ){
		//code sendmail
	}
}

Trong action register() của class EventServiceProvider bạn thêm đoạn code sau:

$this->app->events->subscribe(new UserEventHandler);

Đừng quên đặt đoạn code sau trên đầu file EventServiceProvider.php nhé (vì ta đã sử dụng class UserEventHandler ):

use ProjectsEventsUsersUserEventHandler;

Vậy là đã xong, bạn chỉ việc tạo event khi tạo tài khoản thành công.

Event::fire('user.created', array($user));

Bạn nên đặt nó ở controller sau khi tạo tài khoản thành công, $user là tên biến chứa user object.

Kết luận

Túm váy lại, event là một thứ vô cùng tuyệt vời, giúp ta mở rộng tính năng mà không gặp quá nhiều trở ngại. Ở các bài tiếp theo, mình sẽ giới thiệu về model presenter, custom filter, ... song song với các bài hướng dẫn về laravel cơ bản.

0