Định tuyến và url trong yii2

0
1322

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;

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é