Sử dụng Event trong Laravel
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.
Bài viết này được đăng tại [free tuts .net]
$response = Event::fire('event.name', array($value,$value2));
Trong đó:
event.name
là tên Eventarray($value,$value2)
là các giá trị truyền vào cho event
$response = Event::fire('event.login', array('freetuts.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ứcfire()
)$callback
có thể là function callback hoặc Class
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 Projects\Events; use Illuminate\Support\ServiceProvider; 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:
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
'Projects\Events\EventServiceProvider',
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.php
và SendMailActive.php
trong thư mục Users
, sau đó tạo hai class UserEventHandler
và SendMailActive
tương đương với tên từng file:
<?php namespace Projects\Events\Users; 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', 'Projects\Events\Users\SendMailActive'); } }
<?php namespace Projects\Events\Users; 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 Projects\Events\Users\UserEventHandler;
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.