PHP Online

Laravel Framework 4.x

Laravel 4.x: Tìm hiểu cơ bản về khái niệm Filter

Ở bài trước, tôi đã đề cập đến các khái niệm liên quan đến controller. Một vấn đề cần thiết và quan trọng đối với Laravel framework. Trong bài này, tôi sẽ đề cập tới khái niệm filter để giúp các bạn hoàn thiện bộ 3 Routing - Filter - Controller.
 
Filter chúng ta có thể hiểu một cách đơn giản là bộ lọc, nhiệm vụ của nó là lọc dữ liệu từ phía người dùng trước hoặc sau khi nó chạm tới Routing. Vì thế, nếu bạn tận dụng tốt được filter bạn sẽ tạo ra bộ ứng dụng phòng thủ chuyên nghiệp trong website của bạn. Điều này sẽ giúp bạn xử lý dữ liệu tối ưu hơn.
 
Một phép toán thường thấy nhất trong ứng dụng mà tôi muốn các bạn hiểu ra đây. Chẳng hạn bạn tạo ra 1 routing mà routing này bạn muốn người dùng phải đăng nhập thì mới có thể thao tác được. Như vậy, bạn sẽ làm gì trên nó nào ?. Thông thường chúng ta sẽ xử lý việc kiểm tra ấy trên controller hoặc trên các phương thức khởi tạo như __construct() hoặc init(). Nhưng rõ ràng việc can thiệp xử lý như thế thật thiếu tinh tế phải không nào. Vì lỡ đâu các bạn có nhiều controller thì việc này lại lặp lại một cách hết sức nhàm chán.
 
Với filter của Laravel thì mọi chuyện lại khác hoàn toàn, vì bạn có thể làm điều đó một cách độc lập trên filter, sau đó lồng ghép một cách khéo léo vào routing mà bạn mong muốn. Thì ngay khi request tới với routing sẽ bị filter chặn lại và xử lý. Nếu hợp lệ thì mới tiếp tục đi tới routing, còn nếu không thì sẽ thực thi việc gì đấy của bạn dễ dàng.
 
Để bắt tay vào filter ta thiết lập filter như sau trong file filters.php
Route::filter('tên',hàm xử lý);

Ví dụ:

Route::filter('check_time',function($route,$request){
	if(date('A') == "AM"){
		return "Ban ngày";
	}	
});

Đoạn filter này của chúng ta thực hiện công việc kiểm tra thời gian hiện tại có phải là ban ngày hay không. Do ta dùng hàm date('A') với đối số là A nghĩa là thời gian sẽ trả về AM hoặc PM. Dựa vào đoạn code ở trên, các bạn sẽ thấy là nếu thời gian từ hệ thống là AM nó sẽ chặn yêu cầu tới routing và xuất thông báo "Ban ngày". 

 

Giờ ta tiến hành gắn filter vào routing nào. Mở file routes.php thêm vào cú pháp sau:

Route::get("demo/content/{id}",array("as"=>"content","before"=>"check_time","uses"=>"DemoController@getContent"));

Bạn thấy đấy, trong mảng đối số thứ 2, tôi thêm vào khóa before chỉ tới check_time. Chính là filter ta đã thiết lập trước đó, và đẩy nó sang controller demo với action là getContent.

 

Tạo tiếp file DemoController.php với nội dung sau:

<?php
class DemoController extends BaseController{
	public function getContent($id){
		return "Your ID: $id ";
	}
}

Và chạy đường link localhost/laravel/public/demo/content/999 bạn sẽ thấy kết quả hiển thị phù thuộc theo khung thời gian của bạn.

 

Qua điều này, ta thấy được ý nghĩa và sức mạnh của filter trong thực tế phải không nào. Với filter ta có thể tối giản code ở mức cao nhất và tái sử dụng vô cùng đơn giản.

 

Filter chia ra 2 loại là before và after.

 

Before: Nghĩa là request trước khi tới routing


After: Nghĩa là request sau khi tới routing.

 

Tuy nhiên, trong thực tế. Người ta thường sử dụng before là chính, còn after chỉ sử dụng thực hiện các công đoạn dọn dẹp. Ví dụ như hủy biến, hủy phiên làm việc,....

 

Vậy làm sao để chúng ta truyền giá trị vào filter ?.

 

Để truyền giá trị vào filter chúng ta sử dụng như sau:

Tên filter:giá trị

Ví dụ: check_time:PM

 

Tức ta đang truyền vào filter check_time giá trị là PM.

 

Khi đó ta sửa lại phần thiết lập filter như sau:

Route::filter('check_time',function($route,$request,$param){
	if($param == "AM"){
		return "Ban ngày";
	}	
});

Như bạn thấy, ở đối số function xuất hiện thêm 1 biến là $param. Và $param này chính là giá trị chúng ta truyền từ quá trình thiết lập ở Route.

 

Giờ sửa lại phần routes.php như sau:

Route::get("demo/content/{id}",array("as"=>"content","before"=>"check_time:PM","uses"=>"DemoController@getContent"));

Và chạy lại đường dẫn, bạn sẽ thấy kết quả hiển thị như mong đợi.

 

Tổng kết:

 

Qua các vấn đề ở trên, ta thấy Laravel đã cung cấp cho lập trình viên sự tương tác tuyệt vời của luồng dữ liệu chặn trước và chặn sau một request. Với thế mạnh này, các bạn có thể giản lược mã nguồn xử lý kiểm tra một cách gọn nhất và tiện lợi hơn trong việc tái sử dụng về sau. 

 

Như vậy, tôi đã hướng dẫn cùng các bạn bộ thao tác liên quan đến Routing - Filter - Controller. Tuy chưa phải là trọn vẹn các vấn đề, nhưng nó cũng giúp các bạn có cái hiểu cơ bản nhất về 3 thành phần quan trọng này của laravel. Chúng sẽ là tiền đề tuyệt vời phục vụ cho việc nghiên các các chủ đề mở rộng của chúng ta ở bài học kế tiếp.

 

Trong bài sau, tôi sẽ giới thiệu về blade template trong laravel framework. Một trong những bộ thao tác liên quan đến template tuyệt vời của laravel. Bạn sẽ hoàn toàn cảm thấy thoải mãi và vận dụng laravel một cách linh hoạt trong việc thiết lập liên quan đến master layout.

Khóa học Laravel Framework 4.x


(Bùi Quốc Huy)
8183
Bạn vẫn chưa hiểu rõ vấn đề ?. Bạn vẫn còn nhiều điều thắc mắc ?. Bạn gặp lỗi khi thực hành mã lệnh trên ?. Hãy tham gia diễn đàn QHOnline.Info để nhận được sự giúp đỡ từ phía cộng đồng nhanh nhất. Đồng thời tải những tài liệu giá trị tại diễn đàn. Việc đăng ký là hoàn toàn miễn phí, hãy đăng ký ngay để chúng tôi giúp đỡ bạn nhé.

Ghi rõ nguồn từ website QHOnline.Info - Khi bạn phát hành lại thông tin từ website này

Ý kiến cho bài viết này.