Trong CodeIgniter 3, file routes.php nằm trong thư mục application/config/ và được sử dụng để định nghĩa các quy tắc định tuyến (routing) cho ứng dụng. Routing cho phép bạn ánh xạ các URL đến các controller và phương thức cụ thể trong ứng dụng của bạn. Điều này giúp tạo ra các URL thân thiện với người dùng và dễ quản lý hơn.

Dưới đây là hướng dẫn chi tiết cách sử dụng file routes.php trong CodeIgniter 3.

1. Cấu Trúc Cơ Bản của routes.php

File routes.php có cấu trúc cơ bản như sau:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

Giải thích các tùy chọn mặc định:

  • $route['default_controller']: Đây là controller mặc định mà CodeIgniter sẽ tải khi không có URI cụ thể nào được cung cấp. Ví dụ: khi bạn truy cập example.com/, CodeIgniter sẽ tải controller được chỉ định ở đây. Theo mặc định, nó được đặt là welcome.
  • $route['404_override']: Chỉ định controller/method nào sẽ được sử dụng nếu không có tuyến nào khớp với URI. Đây là trang lỗi 404 tùy chỉnh của bạn.
  • $route['translate_uri_dashes']: Khi được đặt là TRUE, CodeIgniter sẽ thay thế tất cả các dấu gạch ngang trong URI bằng dấu gạch dưới. Điều này rất hữu ích nếu bạn sử dụng dấu gạch ngang trong URL nhưng phương thức hoặc tên controller không thể chứa dấu gạch ngang (vì lý do cú pháp PHP).

2. Các Quy Tắc Định Tuyến Cơ Bản

2.1. Định Tuyến Đơn Giản

Một quy tắc định tuyến cơ bản ánh xạ một URI cụ thể đến một controller và phương thức.

$route['product'] = 'catalog/product';

Trong ví dụ này:

  • Khi người dùng truy cập example.com/product, CodeIgniter sẽ tải controller Catalog và gọi phương thức product() của nó.

2.2. Định Tuyến với Tham Số

Bạn có thể định tuyến với các tham số được chỉ định trong URL.

$route['product/(:num)'] = 'catalog/product_lookup/$1';
  • (:num) là một regex pattern (biểu thức chính quy) xác định rằng chỉ số này phải là số.
  • $1 là tham số đầu tiên bắt được từ regex pattern và được truyền vào phương thức product_lookup của controller Catalog.

Ví dụ: example.com/product/123 sẽ gọi Catalog::product_lookup(123).

2.3. Định Tuyến với Chuỗi Ký Tự

Bạn có thể sử dụng regex để ánh xạ các chuỗi ký tự cụ thể.

$route['profile/(:any)'] = 'user/profile/$1';
  • (:any) khớp với bất kỳ chuỗi nào (số, chữ cái, hoặc ký tự khác).

Ví dụ: example.com/profile/john_doe sẽ gọi User::profile('john_doe').

2.4. Định Tuyến Đa Cấp

Bạn có thể định tuyến đến nhiều cấp trong một controller hoặc method.

$route['blog/(:any)/(:num)'] = 'blog/view/$1/$2';

Ví dụ: example.com/blog/my-first-post/12 sẽ gọi Blog::view('my-first-post', 12).

3. Các Mẫu Biểu Thức Chính Quy (Regex Patterns) Thông Dụng

CodeIgniter sử dụng một số mẫu regex thông dụng để giúp bạn định tuyến các URI một cách dễ dàng:

  • (:num): Bất kỳ số nào (0-9)
  • (:any): Bất kỳ ký tự nào (bao gồm số, chữ cái, và dấu gạch ngang, v.v.)
  • (:segment): Bất kỳ đoạn URI nào (ngoại trừ dấu gạch chéo /)

Bạn cũng có thể tạo các mẫu regex tùy chỉnh. Ví dụ:

$route['post/([a-zA-Z]+)/(\d+)'] = 'post/view/$1/$2';
  • Mẫu này sẽ khớp với một URI bắt đầu với “post/”, theo sau là một chuỗi ký tự (chỉ gồm chữ cái) và một số.

4. Định Tuyến Mặc Định và Ghi Đè

  • Mặc định: Bất kỳ tuyến nào không được định nghĩa rõ ràng sẽ sử dụng định tuyến mặc định (default_controller).
  • Ghi đè: Định tuyến có thể được ghi đè. Ví dụ:
$route['product'] = 'catalog/product';
$route['product'] = 'store/product';

Trong trường hợp này, tuyến 'product' sẽ luôn được ánh xạ đến store/product vì đây là định nghĩa cuối cùng.

5. Sử Dụng Regular Expressions Phức Tạp

Nếu bạn cần các định tuyến phức tạp hơn, bạn có thể sử dụng các regex phức tạp hơn.

Ví dụ: Định tuyến khớp với một ngày tháng cụ thể:

$route['archive/(\d{4})/(\d{2})/(\d{2})'] = 'archive/show/$1/$2/$3';
  • \d{4}: Khớp với bốn chữ số (năm)
  • \d{2}: Khớp với hai chữ số (tháng và ngày)

URL example.com/archive/2024/09/01 sẽ gọi Archive::show('2024', '09', '01').

6. Tạo Các Tuyến Tùy Chỉnh

Bạn có thể tạo các tuyến tùy chỉnh để định nghĩa các quy tắc routing phức tạp hơn hoặc không theo một mẫu cụ thể.

$route['my-custom-route'] = 'controller/method';

7. Sử dụng redirect()

Trong một số trường hợp, bạn có thể muốn chuyển hướng từ một tuyến đến một tuyến khác mà không cần xử lý logic trong controller.

Ví dụ:

$route['old-route'] = 'new-route';

Ngoài ra, bạn có thể sử dụng hàm redirect() trong controller để chuyển hướng người dùng:

public function old_route() {
    redirect('new-route');
}

8. Các Lưu Ý Quan Trọng

  • Thứ tự của các tuyến: CodeIgniter xử lý các tuyến theo thứ tự chúng được định nghĩa. Do đó, các tuyến cụ thể hơn nên được đặt trước các tuyến tổng quát hơn.
  • Không sử dụng dấu gạch ngang trong tên phương thức: PHP không cho phép dấu gạch ngang trong tên phương thức, do đó bạn có thể cần sử dụng $route['translate_uri_dashes'] để tự động chuyển dấu gạch ngang thành dấu gạch dưới.
  • Kiểm tra cẩn thận các tuyến: Sử dụng lệnh echo hoặc hàm log_message() để debug và kiểm tra các tuyến khi cần thiết.

Kết Luận

routes.php trong CodeIgniter 3 là một công cụ mạnh mẽ để tùy chỉnh cách ứng dụng của bạn xử lý các URI. Hiểu và sử dụng nó đúng cách sẽ giúp bạn tạo ra các ứng dụng linh hoạt, thân thiện với người dùng và dễ quản lý.