Điều hướng Url trên CodeIgniter bằng routes file

Trong hệ thống, chúng ta thường muốn thay đổi lại cấu trúc của đường dẫn Url để cho thân thiện với người dùng hơn. CodeIgniter hỗ trợ chúng ta rất tốt việc này. Trong bài này mình xin trình bày cách điều hướng Url trên CodeIgniter bằng routes file.

Bình thường thì ta luông có đối chiếu 1-1 giữa cấu trúc Url với class/method trong controller tương ứng. Các phân đoạn của Url thường có mẫu như sau:

example.com/class/function/id

Nhưng đôi khi chúng ta lại muốn thay đổi mối quan hệ này theo kiểu riêng của mình. Ví dụ như : 

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

Ở trên chúng ta thấy, phân đoạn thứ 2 của Url đáng nhẽ phải là tên của hàm trong controller product thì được thay bằng Id của sản phẩm.

Để thay đổi được cấu trúc Url như trên, CodeIgniter cho phép chúng ta điều hướng bằng cách định nghĩa lại trong file routes.php.

Trong file routes.php chúng ta sẽ tìm thấy một mảng tên là $routes, mảng này cho phép chúng ta xác định từng thành phần điều hướng mà ta muốn.

CodeIgniter đưa ra 2 cách để định nghĩa Url là dùng Thẻ Tự Do hoặc Biểu Thức Chính Quy.

Điều hướng Url trên CodeIgniter bằng routes file

1. Sử dụng kiểu Thẻ Tự Do.

Một Url theo kiểu Thẻ Tự Do có cấu trúc như sau:

$route['product/:num'] = "catalog/product_lookup_1";
$route['product/:any'] = "catalog/product_lookup_2";

Trong một đường dẫn, khóa của mảng route (product/:num hoặc product/:any) chứa URL tương ứng. 

Còn giá trị của mảng (catalog/product_lookup_1) là đích sẽ được điều hướng tới với catalog là tên class và product_lookup_1 là tên method.

(:num) sẽ khớp với một phân đoạn chỉ chứa con số

(:any) sẽ khớp với một phân đoạn chứa mọi ký tự

Một vài ví dụ cho kiểu Thẻ Tự Do:

$route['journals'] = "blogs";

Một Url chứa từ journals trong phân đoạn đầu tiên sẽ khớp với blogs class.

$route['blog/joe'] = "blogs/users/34";

Một Url chứa phân đoạn blog/joe sẽ khớp với blogs class và users method. ID sẽ được thiết lập giá trị là 34

$route['product/(:any)'] = "catalog/product_lookup";

Một Url với phân đoạn đầu tiên là product, và phân đoạn thứ hai là bất cứ ký tự gì sẽ khớp với catalog class và product_lookup method.

$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";

Một Url với phân đoạn đầu tiên là product, và phân đoạn thứ hai là một số sẽ khớp với catalog class và product_lookup_by_id method với tham số được truyền vào hàm chính là số ở phân đoạn thứ 2 của Url.

Chú ý: Không sử dụng ký tự "/" hay "\" trong Url.

2. Kiểu Biểu Thức Chính Quy.

Một ví dụ cụ thể về biểu thức chính quy:

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";

Url ở trên sẽ tương ứng với products/shirts/123 sẽ gọi đến shirts class và id_123 method.

3. Đường dẫn Duy Trì.

Có hai đường dẫn Duy Trì đó là:

$route['default_controller'] = 'welcome';

Đường dẫn này sẽ chỉ định class nào sẽ được tải nếu trên Url không có dữ liệu nào. Trường hợp này là khi người dùng gõ đường dẫn gốc của hệ thống.

Ở ví dụ trên welcome class sẽ được tải. Chúng ta cần thiết phải có đường dẫn mặc định này cho hệ thống.

$route['404_override'] = '';

Đường dẫn này sẽ chỉ định class nào sẽ được tải lên nếu controller được yêu cầu không tìm thấy trên hệ thống. Nó sẽ ghi đè lên trang hiện thị lỗi mặc định.

Nó sẽ không ảnh hưởng tới hàm show_404(), hàm này sẽ tải file error_404.php mặc định trong thư mục application/errors/error_404.php.

Chú ý: Các đường dẫn Duy Trì này phải được đặt trên tất các các đường dẫn Thẻ Tự Do hoặc Biểu Thức Chính Quy khác.

Điều hướng Url trên CodeIgniter bằng routes file

Trên đây mình đã trình bày với các bạn cách điều hướng Url trên CodeIgniter. 

Các bạn có thể xem lại bài Phân trang trên CodeIgniter bằng class Pagination để áp dụng lại những gì đã biết trong bài này.

Chúc các bạn thành công :)

Tags: