CodeIgnitor: URI Routing

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Thường thì có một mối quan hệ một-một giữa một chuỗi URL và controller class/method tương ứng. Các phân đoạn trong một URL thường có dạng như sau:

example.com/class/function/id/

Tuy nhiên trong một số tình huống ta có thể muốn ánh xạ lại mối quan hệ trên theo đó mỗi class/method riêng biệt có thể được gọi thay cho một URL tương ứng.

Ví dụ, ta có thể có URL dạng như sau:

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

Thương thì đoạn thứ hai của URL tương ứng với tên của phương thức, nhưng ở ví dụ trên thì nó lại được thay thế bằng ID của sản phẩm. Để tránh trường hợp này thì CodeIgniter cho phép ta có thể ánh xạ lại bộ xử lý URI.

Thiết lập các quy tắc định tuyến

Các quy tắc định tuyến được định nghĩa trong tập tin application/config/routes.php. Trong tập tin này ta sẽ thấy một mảng có tên $route và nó cho phép ta tạo các tiêu chí định tuyến riêng. Có hai cách định tuyến là sử dụng các ký hiệu đại diện (wildcards) hoặc biểu thức chính quy (Regular Expressions).

Wildcards

Việc định tuyến bằng ký hiệu đại diện thường có dạng như sau:

$route['product/:num'] = 'catalog/product_lookup';

Trong mỗi định tuyến thì chỉ số mảng chứa URI tương ứng, còn giá trị là đích mà nó sẽ được định tuyến lại. Trong ví dụ trên thì nếu "product" được tìm thấy trong đoạn URL và một số được tìm thấy ở đoạn ngay sau thì lớp controller "catalog" và phương thức "product_lookup" sẽ được thay thế tương ứng.

Ta có thể tương thích cách giá trị hằng hoặc cũng có thể sử dụng các loại ký hiệu:

(:num) tương ứng với đoạn (segment) chỉ chứa số.

(:any) sẽ tương ứng với một đoạn chứa bất kỳ ký tự nào ngoại trừ ký tự ‘/’.

Lưu ý

- Các ký hiệu thực ra chỉ là bí danh của các biểu thức chính quy, trong đó :any tương đương với [^/]+ và :num tương đương với [0-9]+.

- Các định tuyến sẽ chạy theo đúng thứ tự chúng được định nghĩa. Các định tuyến cao hơn sẽ có quyền ưu tiên hơn so với các định tuyến thấp hơn.

- Các quy tắc định tuyến không phải là các bộ lọc! Chẳng hạn việc thiết lập một quy tắc như ‘foo/bar/(:num)’ sẽ không ảnh hưởng tới việc gọi controller Foo và phương thức bar với một giá trị không phải là số nếu đó là một định tuyến hợp lệ.

Các ví dụ

Dưới đây là một số ví dụ về định tuyến:

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

Một URL nào đó mà chứa từ “journals” ở đoạn đầu tiên thì sẽ được ánh xạ lại thành lớp “blogs”.

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

Một URL nào đó chứa blog/joe sẽ được ánh xạ lại thành lớp “blogs” và phương thức “users”. ID sẽ được đặt là “34”.

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

Nếu một URL nào đó chứa “product” và đoạn ngay sau nó chưa bất kỳ ký tự nào thì nó sẽ được ánh xạ lại thành lớp “catalog” và phương thức là “product_lookup”.

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

Nếu một URL nào đó chứa “product” và đoạn ngay sau nó chứa một số thì nó sẽ được ánh xạ lại thành lớp “catalog” và phương thức “product_lookup_by_id” đồng thời đối số truyền đi của phương thức là số đó.

Quan trọng

Không sử dụng dấu xổ phải với dạng đầu/cuối.

Biểu thức chính quy (Regular Expression)

Nếu bạn nắm được kiến thức về biểu thức chính quy thì bạn có thể sử dụng nó để định nghĩa các quy tắc định tuyến của bạn. Bất kỳ biểu thức chính quy nào hợp lệ sẽ đều được tham chiếu ngược.

Lưu ý

Nếu bạn sử dụng các tham chiếu ngược thì bạn phải sử dụng ký tự $ thay cho dấu xổ phải.

Một biểu thức chính có thể có dạng như sau:

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

Trong ví dụ trên nếu có một URI products/shirts/123 thì nó sẽ được thay bằng lớp controller “shirts” và phương thức “id_123”.

Với biểu thức chính quy ta có thể bắt nhiều đoạn mỗi lần. Ví dụ nếu người dùng truy cập một mật khẩu đã được bảo vệ trong ứng dụng web của bạn và muốn có thể điều hướng chúng trở về trang tương tự sau khi login thì ta có thể thực hiện như sau:

$route['login/(.+)'] = 'auth/login/$1';

Lưu ý

Trong ví dụ trên, nếu $1 chứa một dấu / thì nó sẽ vẫn được tách thành nhiều đoạn khi truyên tới Auth::login().

Bạn cũng có thể kết hợp wildcard với biểu thức chính quy.

Callback

Nếu bạn đang sử dụng PHP phiên bản từ 5.3 thì bạn có thể sử dụng callback tại vị trí của các biểu thức chính quy để xử lý tham chiếu ngược. Ví dụ:

$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)
{
        return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;
};

Dùng động từ HTTP để định tuyến

Ta có thể sử dụng HTTP (phương thức yêu cầu) để định nghĩa các quy tắc định tuyến của bạn. Đây là cách thường dùng khi xây dựng các ứng dụng tĩnh (RESTful). Bạn có thể sử dụng động từ HTTP (GET, PUT, POST, DELETE, PATCH) hoặc tùy biến nó như (PURGE). Các quy tắc động từ HTTP phân biệt chữ hoa/thường. Tất cả những gì bạn cần làm là thêm động từ như một chỉ số của phần tử mảng để định tuyến. Ví dụ:

$route['products']['put'] = 'product/insert';

Trong ví dụ trên, một yêu cầu PUT tới URI “products” sẽ gọi phương thức Product::insert().

$route['products/(:num)']['DELETE'] = 'product/delete/$1';

Trong ví dụ trên, một yêu cầu DELETE tới URL chứa “products” ở đoạn đầu tiên và sau đó là một số sẽ được ánh xạ thành phương thức Product::delete(), và đối số của phương thức này là số đó.

Việc sử dụng động từ HTTP đương nhiên là một tùy chọn, không phải là bắt buộc.

Định tuyến riêng

Có ba định tuyến riêng đã được tạo sẵn được trình bày dưới đây:

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

Định tuyến này trỏ tới controller 'welcome' và sẽ được thực thi nếu URI rỗng hoặc không có, cụ thể là nó sẽ được load khi người dùng mở chuyển hướng đến URL gốc. Việc thiết lập sẽ chấp nhận giá trị controller/method và index() sẽ là phương thức mặc định nếu bạn không gọi phương thức nào cả. Trong ví dụ trên thì Welcome::index() sẽ được gọi.

Lưu ý

Ta không thể sử dụng thư mục như là một phần của cài đặt này!

Bạn nên chuẩn bị sẵn một định tuyến mặc định khi gặp lỗi 404, nếu không thì trang 404 sẽ mặc định được dùng đến.

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

Định tuyến trên chỉ định lớp controller sẽ được tải nếu controller yêu cầu không tồn tại. Nó sẽ ghi đè trang 404. Nó sẽ không ảnh hưởng tới hàm show_404(), tức là nó sẽ tiếp tục tải tập tin mặc định error_404.php tại application/views/errors/error_404.php.

$route['translate_uri_dashes'] = FALSE;

Tùy chọn trên cho phép ta tự động thay dấu gạch trừ '-' bằng dấu gạch dưới trong controller và phương thức tương ứng, khi thể hiện URL có dấu gạch trừ '-' thì nó sẽ đẹp và thân thiện hơn với công cụ tìm kiếm. Cách thức ở đây là bạn sẽ thay FALSE bằng TRUE để được phép sử dụng.

Quan trọng

Các định tuyến đã lưu phải nằm trước bất kỳ wildcard hay biểu thức chính quy nào.

» Tiếp: Security
« Trước: Cú pháp thay thế PHP
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!