Khi Yii2 bắt đầu xử lý 1 Url được yêu cầu .Bước đầu Yii2 sẽ bắt đầu phân tích dữ liệu các url vào 1 route .Router sau đó sẽ nhanh chóng gửi yêu cầu đến các controller với những action tương ứng .Toàn bộ quá trình này được gọi là routing .
Component urlManager chịu trách nhiệm xử lý các request đến và tạo ra các đường dẫn url thông qua 2 phương thức là parseRequest() và createUrl() .Dưới đây là ví dụ về cách tạo url trong file view
use yii\helpers\Html; .......... $url = Url::to ( ['site/about'] ); echo $url;
Nội dung chính
1 Default Route
default route có nhiệm vụ giải quyết những định tuyến rỗng như lời gọi đến trang chủ hay website .Cấu hình bạn vào main.php trong phần config thêm dòng
'defaultRoute' => 'demo/index',
2 Tạo urls
Yii2 cung cấp quá trình tạo url cho chúng ta 1 cách nhanh và đơn giản với hàm Url::to()
Dưới đây là những cách tạo url
use yii\helpers\Url; // tạo url dạng : /index.php?r=site%2Findex echo Url::to(['site/index']); // tạo url với tham số id: /index.php?r=site%2Fview&id=100 echo Url::to(['site/view', 'id' => 100]); // tạo url với 1 neo ,dùng khi nhiều tab: /index.php?r=site%2Fview&id=100#content echo Url::to(['site/view', 'id' => 100, '#' => 'content']); // tạo url đầy đủ ,thường dùng trong seo phần đầu : http://www.example.com/index.php?r=site%2Findex echo Url::to(['site/index'], true); // tạo url đầy đủ với https: https://www.example.com/index.php?r=site%2Findex echo Url::to(['site/index'], 'https');
1 số phương pháp tạo url mặc định
use yii\helpers\Url; // quay về trang chủ: /index.php?r=site%2Findex echo Url::home(); // base url trỏ về trang chủ nếu có subdomain echo Url::base(); // tạo link canonical echo Url::canonical(); //kết quả http://localhost/demoyii2/frontend/web/index.php?r=demo%2Findex // tạo link trỏ về trang trước đó Url::remember(); echo Url::previous();
Link thân thiện trong Yii2
Để có thể sử dụng được link thân thiện trong yii2 bạn phải add component urlmanager trong file main.php ở config
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ],
Vậy là xong nếu bạn dùng nginx còn nếu dùng apache thì phải tạo file .htaccess trong frontend/web hoặc backend/web có nội dung như sau
Options +FollowSymLinks IndexIgnore */* 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
Kinh nghiệm sương máu của mình là ko nên rewiter trực tiếp trong htaccess nhé mà nên trong code chứ mà nhiều lúc khách nổi hứng chuyển server sang nginx lại phải update lại mệt người
URL Rules
Url rules sẽ mang lại sức mạnh cho chúng ta .Những thứ đáng nhẽ bạn rewiter trong htaccess thì bạn mang cả vào đây thôi
[ 'user' => 'user/index', 'user/<id:\d+>' => 'user/view', ]
Ở đây cấu trúc là url =>action xử lý + thông tin get .Vài thứ mà bạn có thể cần đến là
'enablePrettyUrl' => true, 'showScriptName' => false, 'suffix' => '.html',
Đoạn lệnh 1 là yêu cầu url đẹp,đoạn 2 xóa bỏ index.php .Đoạn 3 thêm sau .hml
Ví dụ về rules trong yii2
'rules' => [ 'demo/<id:\d+>' => 'demo/index', 'demo/<year:\d{4}>/<category>' => 'demo/index', 'demo' => 'demo/index' ]
rules trên chúng ta có thể dùng rewiter như sau trong file views yii2 tương ứng
echo Url::to(['demo/index', 'year' => 2014, 'category' => 'php']); echo Url::to(['demo/index']); echo Url::to(['demo/index','id'=>123]);
Và kết quả sẽ hiển thị như sau
demoyii2/frontend/web/demo/2014/php.html /demoyii2/frontend/web/demo.html /demoyii2/frontend/web/demo/123.html
Ok giờ đến phần quan trọng nhất chính là
HTTP Methods trong url
Khi tạo các RESTfull thì vấn đề định tuyến rất quan trọng bạn có thể nom ví dụ dưới đây về rules khi tạo RESTfull
[ 'PUT,POST user/<id:\d+>' => 'user/create', 'DELETE user/<id:\d+>' => 'user/delete', 'user/<id:\d+>' => 'user/view', ]
Lưu ý ở đây d+ là 1 dẫy số ,w+ là 1 dẫy chữ hoặc số lẫn chữ nhé các bạn
Thêm rules động
Cái này thì mình khuyến cáo không nên dùng vì dùng sẽ làm rối site và khó sửa chữ nhưng trừ trường hợp đặc biệt thì bạn có thể thêm vào .Ví dụ
$app->getUrlManager()->addRules([ // rules của bạn ], false);
Cám ơn các bạn đã đọc .Có gì ko hiểu hãy comment bên dưới bài viết nhé