NTM Solutions

Facebook Youtube Google+

Thứ Bảy, 8 tháng 12, 2018

Tự học CodeIgniter-Bài 16-Định hướng URI


#hoccodeigniter


Thông thường, mỗi quan hệ giữa 01 chuỗi URLvà lớp controller/phương thức tương ứng là 1-1. Các phân đoạn trong 01 URI thường theo kiểu mẫu như sau:

example.com/lớp/hàm/id/

Trong 01 vài trường hợp, bạn có thể muốn thay đổi mối tương quan này  ví dụ như 01 lớp/phương_thức khác có thể được gọi thay vì như mặc định trong đường dẫn URL.


Ví dụ, hãy xem như bạn muốn liên kết URL của bạn sẽ có dạng như vầy:

example.com/product/1/

example.com/product/2/

example.com/product/3/

example.com/product/4/

Thông thường, phân đoạn thứ 02 của URL được giữ lại như là tên phương thức, nhưng trong ví dụ trên nó lại là phần ID của sản phẩm. Để làm được điều này, CodeIgniter cho phép bạn thay đổi hành vi của liên kết URI.

Thiết lập các qui luật dẫn đường của riêng bạn

Các qui tắc dẫn đường được xác định trong tập tin application/config/routes.php. Trong tập tin này bạn sẽ thấy 01 mảng $route cho phép ta xác định các đường đi riêng. Các tuyến đường có thể được xác định bằng cách dùng các ký tự đại diện hoặc các biểu thức thông dụng.

Ký tự đại diện

01 đường dẫn dùng ký tự đại diện có thể trông như vầy:

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

Trong 01 tuyến đường, khóa mảng chứa liên kết URI phải khớp, trong khi mảng giá trị chứa đích đến cũng phải được định tuyến lại. Trong ví dụ trên, nếu từ “product” được tìm thấy trong phân đoạn đầu tiên của liên kết URL, và 01 con số được tìm thấy trong phân đoạn thứ 02 , lớp “catalog” và phương thức “product_lookup” sẽ được dùng ở đây.

Bạn có thể dùng từ khớp các gía trị hoặc cũng có thể dùng 02 loại ký tự đại diện sau:

(:num) sẽ khớp 01 phân đoạn chỉ có chứa các giá trị số.

(:any) sẽ khớp 01 phân đoạn chứa ký tự bất kỳ (ngoại trừ dấu sổ ‘/’, mà ta dùng để phân cách các phân đoạn).

Ghi chú 01:

Các ký tự đại diện thật ra là các tên mật danh cho các biểu thức thông dụng (regular expressions), với

:any được dịch ra dạng biểu thức là [^/]+

:num được dịch ra dạng biểu thức là [0-9]+

Ghi chú 02:

Các định tuyến sẽ chạy theo trật tự mà chúng được định. Các định tuyến có độ ưu tiên cao hơn sẽ luôn được ưu tiên thực thi hơn tuyến có độ ưu tiên thấp hơn.

Ghi chú 03:

Các qui luật định tuyến không phải là các bộ lọc! Thiết lập 01 qui luật của ví dụ như ‘foo/bar/(:num)’ sẽ không ngăn controller Foo và phương thức bar được gọi kèm với 01 giá trị không phải là số nếu đó là 01 định tuyến hợp lệ.

Các ví dụ

Sau đây là 01 vài ví dụ về định tuyến:

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

01 liên kết URL chứa từ “journals” trong phân đoạn đầu sẽ định tuyến lại khớp với lớp “blogs”.

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

01 liên kết URL chứa các phân đoạn blog/joe sẽ định tuyến lại khớp với lớp “blogs” và phương thức “users”. ID sẽ được thiết lập là “34”.

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

01 liên kết URL với “product” là phân đoạn 01, và bất kỳ cái gì trong phân đoạn 02 sẽ định tuyến lại khớp với lớp “catalog” và phương thức “product_lookup”.

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

01 URL với “product” là phân đoạn 01, và 01 số trong phân đoạn 02 sẽ định tuyến lại khớp với lớp “catalog” và phương thức “product_lookup_by_id” có tham số là ID truyền vào tương ứng.

Điều cần chú ý:

Không dùng các dấu sổ chéo /\.

Các biểu thức thông dụng

Nếu bạn thích bạn có thể dùng biểu thức thông dụng để xác định các qui luật định tuyến. Bất kỳ biểu thức thông dụng hợp lệ nào được cho phép , như là các liên kết dùng lại.

Ghi chú 01:

Nếu bạn dùng lại phần liên kết bạn phải dùng cú pháp có dấu dollar thay vì dùng  02 dấu sổ // như trong kiểu đường dẫn thư mục.

01 định tuyến kiểu biểu thức RegEx sẽ trông như vầy:

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

Trong ví dụ trên, 01 liên kết URI giống kiểu như products/shirts/123 sẽ gọi đến lớp controller “shirts” và phương thức “id_123” .

Với các biểu thức thông dụng, bạn cũng có thể khớp nhiều phân đoạn cùng 01 lúc. Ví dụ, nếu 01 người dùng truy cập đến 01 vùng có bảo vệ mật khẩu trên ứng dụng web của bạn và bạn muốn chuyển hướng chúng đến cùng 01 trang sau khi chúng đăng nhập , bạn có thể dùng cấu trúc sau:

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

Ghi chú 02:

Trong ví dụ trên, nếu tham số $1 có 01 dấu sổ, nó sẽ tự động chia thành nhiều tham số khi truyền vào Auth::login().

Để tìm hiểu thêm về các biểu thức thông dụng RegEx các bạn vô trang này: regular-expressions.info

Ghi chú 03:

Bạn cũng có thể phối hợp các ký tự đại diện với các biểu thức thông dụng.

Hàm callbacks

Bạn cũng có thể dùng các hàm callbacks trong các qui luật định tuyến thông thường để thực thi các liên kết lặp lại . Ví dụ:

$route['products/([a-zA-Z]+)/edit/(\d+)'] = function ($product_type, $id)

{

        return 'catalog/product_edit/' . strtolower($product_type) . '/' . $id;

};

Sử dụng từ khóa HTTP trong việc định tuyến

Hoàn toàn có thể sử dụng các từ khóa HTTP (phương thức yêu cầu) để xác định các qui luật định tuyến của bạn. Đây là phần hữu dụng khi xây dựng ứng dụng RESTful. Bạn có thể dùng các từ khóa HTTP tiêu chuẩn (GET, PUT, POST, DELETE, PATCH) hoặc 01 cái tùy chọn  (ví dụ PURGE). Từ khóa HTTP dùng trong các qui tắc phải viết HOA HẾT. Tất cả những gì bạn cần làm là thêm từ khóa như 01 chỉ số mảng trong định tuyến. Ví dụ:

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

Trong ví dụ trên, 01 yêu cầu PUT đến URI “products” sẽ gọi phương thức controller Product::insert()

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

01 yêu cầu DELETE gửi đến URL với “products” là phân đoạn 01 và 01 giá trị số trong phân đoạn 02 sẽ định tuyến khớp với phương thức Product::delete() , giá trị số truyền vào xem như là tham số đầu của phương thức.

Việc sử dụng các từ khóa HTTP nói nào ngay là 01 tùy chọn.

Các định tuyến định trước

Có 03 định tuyến định trước trong tập tin routes.php:

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

Định tuyến này trỏ về hành động sẽ thực thi nếu liên kết URI không chứa dữ liệu, đây chính là trường hợp khi người dùng tải URL thư mục gốc. Thiết lập chấp nhận 01 giá trị controller/phương_thức và phương thức index() sẽ là phương thức mặc định  nếu bạn không chỉ rõ phương thức nào. Trong ví dụ trên phương thức Welcome::index() sẽ được gọi.

Ghi chú:

Bạn KHÔNG THỂ dùng 01 thư mục như là 01 phần của thiết lập!

Khuyến khích bạn luôn có 01 định tuyến mặc định thay cho trang báo lỗi 404.

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

Định tuyến này chỉ ra rằng lớp controller nào sẽ được gọi nếu controller được yêu cầu không tồn tại. Nó sẽ chồng lên trang báo lỗi 404 mặc định. Các qui tắc về phân cách thư mục giống y phần ‘default_controller’.

Thiết lập ở đây sẽ không tác động gì đến hàm show_404() , là hàm sẽ tiếp tục tải tập tin mặc định error_404.php đặt tại application/views/errors/error_404.php.

$route['translate_uri_dashes'] = FALSE;

Rõ ràng ở đây có giá trị luận lý (TRUE/FALSE) -> đây thực sự không phải là 01 định tuyến . Tùy chọn này cho phép bạn tự động thay thế dấu (‘-‘) với dấu gạch dưới trong phân đoạn controller và phương thức của liên kết URI. Điều này là cần thiết, bởi vì dấu ‘-‘ không phải là ký tự hợp lệ của tên lớp hay phương thức và sẽ gây lỗi nghiêm trọng nếu bạn cố dùng.

Nếu vẫn chưa rõ các bạn xem thêm video clip sau:




By #tiensim

Nguồn: User Guide – General Topics