Định tuyến và tạo URL
Định tuyến hay Routing trong Yii2 là kĩ thuật điều hướng thông qua các URL được request từ client gửi đến server. Routes chính là cầu nối giao tiếp chính khi người dùng thao tác với website. Chính vì vậy mà việc routing nhằm tạo ra các URL thân thiện với người dùng nhưng vẫn đáp ứng đủ yêu cầu về mặt kĩ thuật. Routing xuất hiện ở hầu hết các framework của PHP. Bài viết này tại hạ sử dụng Yii2 Advanced (Bản basic cũng tương tự).
Với Yii2 advanced để truy cập vào ứng dụng thông qua các controller, các "đồng code" phải copy các file trong thư mục frontend/web ra thư mục gốc để request Url có dạng: http://localhost/<thư mục dự án>/index.php?r=<tên controller>/<tên action>. Nếu chưa đưa file index.php từ thư mục frontend/web ra ngoài thì Url sẽ có dạng: http://localhost/<thư mục dự án>/frontend/web/index.php?r=<tên controller>/<tên action>
Ví dụ: Tại hạ tạo 1 file controller là SiteController.php nằm trong thư mục frontend/controllers, có 1 action là actionAbout và 1 file view là about.php nằm trong thư mục frontend/views/site (Ở đây chưa có thao tác với dữ liệu nên tại hạ chưa dùng đến file model).
Url truy cập sẽ có dạng: http://localhost/advanced/index.php?r=site/about (ở Yii2 khi gọi 1 action trong controller thì tiền tố action sẽ được loại bỏ)
Để truyền tham số dưới dạng GET vào URL sẽ có dạng như sau: http://localhost/<thư mục dự án>/index.php?r=<tên controller>/<tên action>&<tên tham số 1> = <giá trị tham số 1>&<tên tham số 2> = <giá trị tham số 2>.....&<tên tham số n> = <giá trị tham số n>.
Như ví dụ trên tại hạ sẽ truyền thêm 2 tham số là name và phone thì Url sẽ có dạng: http://localhost/advanced/index.php?r=site/about&name=abc&phone=123456.
Tại hạ sẽ cho hiển thị 2 tham số này ở view about như sau: Ở đây các "đồng code" có thể dùng truyền từ controller ra cũng được, nhưng tại hạ muốn nhanh thì truyền luôn ở view =))
Yii2 cung cấp đối tượng yii\web\Request với 2 phương thức được dùng phổ biến là post và get để nhận giá trị request từ client như hình dưới đây
Và ta được kết quả khi truyền vào:
Có 1 cái hay ho nữa là nếu muốn dùng Url Friendly hay Đường dẫn thân thiện thì các đồng code cấu hình urlManager trong file frontend/config/main.php như sau:
- enablePrettyUrl: Bật chế độ đường dẫn thân thiện và loại bỏ ?r=.
- showScriptName: Hiển thị index.php trên Url, nếu không muốn các "đồng code" set giá trị là false
- rules: Các định dạng được thiết lập để Url có dạng đường dẫn thân thiện có lợi cho SEO website.
Sau đó các "đồng code" bật mod_rewrite trong file php.ini lên rồi tạo tiếp 1 file .htaccess có nội dung như sau:
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
Sau khi config Url truy cập sẽ có dạng http://localhost/advanced/site/about?name=abc&phone=123456. Để đi chi tiết hơn về phần rules của Url friendly, tại hạ sẽ viết 1 bài riêng về phần này.
Cài đặt Route mặc định
Khi client truy cập website với tên miền không có route thì đó đươc coi là định tuyến mặc định, VD: domain.com là 1 Default Route vì không có các phân đoạn đằng sau url, domain.com/abc thì có phân đoạn /abc nên không là default route. Để có thể tùy chỉnh điều hướng mặc đinh, cần thay đổi defaultRoute trong frontend/config/main.php như sau:
Ở đây tại hạ set giá trị là site/about, các "đồng code" có thể set giá trị tùy vào ý mình theo đúng cấu trúc <controller>/<action>
Và sẽ được kết quả mặc đinh điều hướng vào about:
Cài đặt chế độ bảo trì
Đôi khi, các "đồng code" muốn tạm thời đặt ứng dụng Web của mình ở chế độ bảo trì và hiển thị cùng một trang thông tin để thông báo về việc bảo trì đó. Có nhiều cách để thực hiện việc này. Nhưng một trong những cách đơn giản nhất là cấu hình thuộc tính catchAll trong frontend/config/main.php như sau trong:
Ở đây tại hạ vẫn sử dụng route là site/about thì khi vào bất cứ trang nào thì hệ thống đều điều hướng về site/about ở đây các "đồng code" có thể tạo ra action maintain và tạo thêm 1 view maintain để hiển thị thông báo bảo trì.
Tạo URL
Để tạo ra Url, các "đồng code" sử dụng helper Url của Yii như sau:
Ở đây tại hạ sẽ tạo ra Url trên view about bằng việc sử dụng phương thức to() như dưới đây
hoặc có thể sử dụng đối tượng urlManager để tạo URL
Và kết quả là:
Tổng Kết
Bài viết chủ yếu tập trung về vấn đề điều hướng dựa trên các URL và cách tạo ra chúng, sử dụng các định tuyến một cách hiệu quả nhất.