LARAVEL TUTORIALS
10 thủ thuật Lavavel giúp bạn code nhanh hơn! Routing trong Laravel, cách tạo Route và sử dung AZ Tạo Middleware trong Laravel đơn giản trong 5 phút Xử lý Authentication và Authorization trong Laravel Event và listener trong Laravel, cách tạo và quản lý cơ bản nhất Tạo broadcast event trong Laravel dễ dàng trong 10 phút Xử lý Form Validation trong Laravel từ A - Z Cách tạo Session và cookie trong Laravel dễ dàng như ăn cháo Top 10 Package Lavavel thường dùng trong dự án Laravel Sử dụng Task trong Laravel đơn giản trong 10 phút. Cách tạo API trong Laravel đơn giản chỉ trong 5 phút Cách tạo job trong Laravel sao cho hiệu quả? Queues trong Laravel, dùng để xử lý các tác vụ mất nhiều thời gian Cache trong Laravel, các loại Cache thường dùng trong Laravel Redis trong Laravel, biết cách sử dung Redis Laravel trong 5 phút Sử dụng Memcache trong Laravel tăng tốc độ truy cập website Unit Test trong Laravel, thực hành tạo testing Laravel A-Z 10 thủ thuật tối ưu quá trình Testing trong Laravel Top 7 thư viện Testing Laravel được dùng nhiều nhất Testbench và Orchestra Testbench trong Laravel, kiểm thử Laravel dễ dàng Cách dùng Browser Testing (Laravel Dusk) trong Laravel Cách tạo test case cho Controller trong Laravel Cách tạo test case cho Model trong Laravel Cách tạo Database Testing trong Laravel Real-time web applications là gì ? Tầm quan trọng trong Laravel Laravel WebSockets, các bước tạo WebSockets trong Laravel Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime Cách dùng Long polling trong Laravel để cải thiện trải nghiệm Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ Cách dùng Event Sourcing trong Laravel Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản Sử dụng Service Container trong Laravel dễ dàng Cách xử lý đa ngôn ngữ trong Laravel dễ dàng Tìm hiểu và sử dụng Service Provider trong Laravel Facades là gì? Cách dùng Facades trong Laravel Cách sử dụng Email Verification trong Laravel Cách dùng URL Generation trong Larevel Cách sử dụng Error Handling trong Laravel Cách dùng Encryption và decryption trong Laravel Cách sử dụng Relationships trong Laravel Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows Sử dụng Event trong Laravel Một cách quản lý filter trong Laravel
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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 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('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ứ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 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:

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

'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.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 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.

Cùng chuyên mục:

Cách sử dụng Relationships trong Laravel

Cách sử dụng Relationships trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách dùng Encryption và decryption trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách sử dụng Error Handling trong Laravel

Cách dùng URL Generation trong Larevel

Cách dùng URL Generation trong Larevel

Cách sử dụng Email Verification trong Laravel

Cách sử dụng Email Verification trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Facades là gì? Cách dùng Facades trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Tìm hiểu và sử dụng Service Provider trong Laravel

Sử dụng Service Container trong Laravel dễ dàng

Sử dụng Service Container trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách xử lý đa ngôn ngữ trong Laravel dễ dàng

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách sử dụng CQRS trong Laravel từ A đến Z đơn giản

Cách dùng Event Sourcing trong Laravel

Cách dùng Event Sourcing trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Task Scheduling là gì? Cấu hình Task Scheduling trong Laravel

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách dùng Queue trong laravel để tạo tác vụ bất đồng bộ

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách tích hợp Vue.js vào Laravel và làm một ứng dụng căn bản

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Cách dùng Long polling trong Laravel để cải thiện trải nghiệm

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Dùng Server-Sent Events trong Laravel để làm ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Cách dùng Socket.io trong Laravel để tạo ứng dụng realtime

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Laravel WebSockets, các bước tạo WebSockets trong Laravel

Real-time web applications là gì ? Tầm quan trọng  trong Laravel

Real-time web applications là gì ? Tầm quan trọng trong Laravel

Cách tạo Database Testing trong Laravel

Cách tạo Database Testing trong Laravel

Top