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.
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.
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ệ.
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 /\.
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.
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;
};
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ó 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
Không có nhận xét nào:
Đăng nhận xét