Làm cách nào để đặt định tuyến trong Yii2?

Một chủ đề quan trọng đối với bộ điều khiển, mặc dù không được quy định trong mã bộ điều khiển thực tế là các tuyến đường. Các tuyến đường là cách các URL ánh xạ tới bộ điều khiển và hành động được gọi. Chương 3, “Hướng dẫn sử dụng trang Yii của bạn,” đã giới thiệu khái niệm cơ bản và Chương 4 giải thích cách định cấu hình thành phần “urlManager” để thay đổi cách định dạng tuyến đường. Bây giờ chúng ta hãy xem xét chủ đề chi tiết hơn

Đây là đoạn trích từ Chương 7, “Làm việc với Bộ điều khiển,” của “Sách Yii“

Đường dẫn so với. Được

URL trong Yii sẽ có một trong hai định dạng

http. //www. ví dụ. com/chỉ mục. php?r=ControllerID/ActionID

hoặc

http. //www. ví dụ. com/chỉ mục. php/Trình điều khiểnID/ActionID/

Định dạng đầu tiên là mặc định và được gọi là định dạng “get”, vì các giá trị được truyền như thể chúng là các biến GET tiêu chuẩn (bởi vì chúng đúng như vậy). Định dạng thứ hai là định dạng “đường dẫn”, trong đó các giá trị xuất hiện như thể chúng là một phần của đường dẫn (i. e. , như thể chúng ánh xạ tới các thư mục trên hệ thống tệp). Như đã giải thích trong Chương 4, định dạng này được kích hoạt bằng cách bỏ ghi chú phần thích hợp của tệp cấu hình

# protected/config/main.php
'components'=>array(
    'urlManager'=>array(
        'urlFormat'=>'path',
    // Etc.

Đây là công cụ khá cơ bản và có lẽ đã ăn sâu vào bạn bây giờ. Phần quan trọng của khái niệm này là cách bạn xác định các quy tắc để đọc chính tả các đường dẫn

Lưu ý rằng, để đơn giản, tôi sẽ cho rằng bạn đang sử dụng định dạng đường dẫn từ đây trở đi. Hơn nữa, các quy tắc áp dụng cho phần "đường dẫn" của URL. rằng sau lược đồ (e. g. , http hoặc https) và tên miền (e. g. , www. ví dụ. com/). Vì vậy, trong phần còn lại của phần giải thích này, nói chung, tôi sẽ bắt đầu các URL trình diễn của mình mà không có http giả định. //www. ví dụ. com/

{TIP} Bạn thực sự có thể áp dụng các quy tắc của mình cho toàn bộ URL, bao gồm cả miền và/hoặc miền phụ. Xem tài liệu lớp cho lớp CurlManager để biết ví dụ

Quy tắc tuyến đường

Đây là các quy tắc mặc định được đặt trong tệp cấu hình

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),

Chính xác thì điều gì đang diễn ra ở đó và quan trọng hơn là làm thế nào để bạn hiểu những quy tắc này đủ để bạn có thể thực hiện quy tắc của riêng mình?

Quy tắc “urlManager” áp dụng cả khi đọc trong URL và khi tạo URL (e. g. , dưới dạng liên kết). Các quy tắc phục vụ hai mục đích. xác định tuyến đường–bộ điều khiển và hành động–và đọc hoặc chuyển qua bất kỳ tham số nào

Mỗi quy tắc sử dụng một cặp tên=>giá trị để liên kết một giá trị với một tuyến đường. Ví dụ: đây là một quy tắc đơn giản.

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
6. Với quy tắc đó, URL http. //www. ví dụ. com/home sẽ gọi hành động “index” của bộ điều khiển “site”. Và tương tự, nếu bạn tạo một URL tới route “site/index”, Yii sẽ đặt URL đó là http. //www. ví dụ. com/nhà

Rõ ràng việc mã hóa cứng các chuỗi ký tự thành các tuyến đường có sức hấp dẫn hạn chế. Để làm cho quy tắc của bạn linh hoạt hơn, hãy áp dụng biểu thức chính quy và trình giữ chỗ được đặt tên làm giá trị. Cú pháp đó là. . Bạn cần phải hiểu các biểu thức thông thường để làm theo phương pháp này

Ví dụ: hãy quay lại quy tắc cuối cùng được xác định theo mặc định trong tệp cấu hình

'<controller:\w+>/<action:\w+>' => '/',

Phần đầu tiên của điều đó là. Điều đó có nghĩa là quy tắc đang tìm kiếm cái được gọi là "từ" biểu thức chính quy, được đại diện bởi

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
7. Trong tiếng Anh đơn giản hơn, biểu thức chính quy cụ thể đó tìm kiếm một chuỗi gồm một hoặc nhiều ký tự chữ và số. Sau khi tìm thấy, nhãn quy tắc kết hợp là bộ điều khiển

Tiếp theo, quy tắc tìm kiếm một dấu gạch chéo

Tiếp theo, quy tắc tìm kiếm một “từ” khác.

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
7. Sau khi tìm thấy, quy tắc sẽ gắn nhãn kết hợp đó là hành động

Sau đó, các nhãn–phần giữ chỗ được đặt tên–có thể được sử dụng để thiết lập tuyến đường. (Hãy coi điều này giống như tham chiếu ngược lại trong các biểu thức chính quy, nếu bạn đã quen với khái niệm đó. )

Do đó, quy tắc này đánh đồng một URL của anyword1/anyword2 với tuyến đường “anyword1/anyword2”. Hy vọng rằng liên kết theo nghĩa đen đó có ý nghĩa, nhưng hãy nhớ rằng đây là một liên kết theo nghĩa đen linh hoạt, không giống như liên kết được mã hóa cứng được hiển thị trước đó

{TIP} Bạn có thể hiểu các tuyến đường và biểu thức chính quy dễ dàng hơn nếu bạn đã quen với việc sử dụng công cụ

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
9 của Apache, công cụ này hơi giống

Thông số xử lý

Khi bạn hiểu các khái niệm mà tôi đã trình bày cho đến nay, sẽ có một bước ngoặt mới để giới thiệu. thông số. Nhiều hành động sẽ yêu cầu chúng, chẳng hạn như hành động “xem” và “cập nhật” cần chấp nhận giá trị ID của bản ghi đang được xem hoặc cập nhật. Những giá trị cụ thể đó sẽ luôn là số nguyên, bạn có thể sử dụng mẫu biểu thức chính quy

'<controller:\w+>/<action:\w+>' => '/',
0 để khớp chúng. Đó là những gì đang xảy ra trong quy tắc đầu tiên

________số 8

Quy tắc đó tìm kiếm một "từ", theo sau là dấu gạch chéo, theo sau là một hoặc nhiều chữ số. Phần chữ số là một tham số được đặt tên, được gắn nhãn “id”. Vì vậy, trang/42 được liên kết với tuyến đường “trang/xem”. Nhưng còn 42 thì sao? . nó không phải là bộ điều khiển cũng không phải là một hành động. Nó đi đâu?

# protected/controllers/PageController.php
public function actionView($id) {
    // Etc.

Để Yii thực thi hành động “xem”, nó gọi phương thức đó, truyền tham số. Vì vậy, trong trường hợp cụ thể này, route sẽ là “page/view” nhưng phương thức

'<controller:\w+>/<action:\w+>' => '/',
1 của bộ điều khiển “page” cũng sẽ có thể sử dụng
'<controller:\w+>/<action:\w+>' => '/',
2, sẽ có giá trị là 42. Có một vướng mắc nhỏ…

Thông thường, việc bạn đặt tên cho các tham số của mình trong một hàm không quan trọng

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
2

Tuy nhiên, khi bạn đã xác định một tham số trong quy tắc không phải là một phần của lộ trình, thì tham số đó sẽ chỉ được chuyển đến một hành động nếu tham số của hành động đó được đặt tên giống nhau. Mã ví dụ trước hoạt động, nhưng định nghĩa hành động này với cùng quy tắc đó sẽ đưa ra một ngoại lệ

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
3

{LƯU Ý} Trình giữ chỗ, như tôi đang gọi chúng, và các tham số được tạo theo quy tắc theo cùng một cách, tôi chỉ đang sử dụng hai thuật ngữ khác nhau để phân biệt giữa các kết quả phù hợp sẽ được sử dụng trong các tuyến đường (i. e. , trình giữ chỗ) và những thứ được chuyển đến phương thức hành động (i. e. , thông số)

Tiến thêm một bước nữa, giả sử bạn muốn hỗ trợ hai tham số. Ví dụ: bạn có quy trình xác minh người dùng, trong đó người dùng nhấp vào liên kết trong email đưa họ trở lại trang web để xác minh tài khoản. Liên kết phải chuyển hai giá trị trong URL để nhận dạng duy nhất người dùng. một số và một hàm băm (một chuỗi ký tự). Quy tắc để bắt đó có thể là

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
4

Quy tắc đó nói rằng từ "xác minh" theo nghĩa đen, theo sau là dấu gạch chéo, tiếp theo là chữ số, tiếp theo là dấu gạch chéo khác, theo sau là cụm từ thông dụng "từ" phải được chuyển đến "người dùng/xác minh". Với các tham số được đặt tên, phương thức

'<controller:\w+>/<action:\w+>' => '/',
3 nên được viết để chấp nhận hai tham số,
'<controller:\w+>/<action:\w+>' => '/',
4 và
'<controller:\w+>/<action:\w+>' => '/',
5

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
8

Có vẻ lạ, bạn có thể đặt các tham số đó theo một trong hai thứ tự và nó vẫn hoạt động. Bạn thậm chí có thể viết phương thức chỉ với một hoặc không có tham số và hành động vẫn có thể được gọi mà không gặp lỗi (mặc dù hành động sẽ không được truyền cả hai tham số trong trường hợp đó). Thực sự, điều duy nhất bạn không thể làm là xác định phương thức lấy tham số có tên khác với tên trong quy tắc

Một ví dụ nữa về điều này, để thực sự hiểu rõ vấn đề, giả sử bạn muốn có một cách để xem hồ sơ của người dùng theo tên. người dùng/myUserName, người dùng/yourUserName, v.v. Quy tắc đó có thể là

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
9

Quy tắc đó liên kết tuyến “người dùng/chế độ xem” với giá trị đó và tạo một tham số có tên là “tên người dùng”. (Lưu ý rằng mẫu biểu thức chính quy để khớp với tên người dùng thực tế sẽ phụ thuộc vào ký tự bạn cho phép trong tên người dùng. )

Bây giờ cho hành động, có lẽ sẽ lấy hồ sơ của người dùng từ cơ sở dữ liệu bằng tên người dùng

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
0

Nhìn vào quy tắc mặc định cuối cùng được tạo bởi

'<controller:\w+>/<action:\w+>' => '/',
6, hành động “chỉnh sửa” và “cập nhật” được xử lý bởi quy tắc này

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
1

Quy tắc đó sẽ bắt trang/chỉnh sửa/42 hoặc trang/xóa/42 (cũng như trang/lần xem/42). Và, một lần nữa, mỗi hành động phải được xác định sao cho nó nhận một tham số có tên cụ thể là

'<controller:\w+>/<action:\w+>' => '/',
2

Hiểu rằng các luật được kiểm tra theo thứ tự từ trên xuống, luật đầu tiên tạo thành trận đấu sẽ được tính bằng lộ trình của nó. Ngoài ra, từ cả quan điểm hiểu và để có hiệu suất tốt hơn, bạn nên cố gắng có càng ít quy tắc càng tốt

phân biệt chữ hoa chữ thường

Trước khi đi vào một vài ví dụ nữa, tôi nên làm rõ rằng các quy tắc định tuyến phân biệt chữ hoa chữ thường theo mặc định. Điều này có nghĩa là mặc dù biểu thức chính quy

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
7 sẽ khớp với Bài đăng, bài đăng hoặc pOsT, nhưng chỉ bài đăng mới khớp với bộ điều khiển trong ứng dụng của bạn

Như đã giải thích trước đây, ID bộ điều khiển là tên của lớp bộ điều khiển trừ đi phần “Bộ điều khiển”, với chữ cái đầu tiên được viết thường. Do đó,

'<controller:\w+>/<action:\w+>' => '/',
9 trở thành “trang web”, nhưng
'<controller:\w+>/<id:\d+>' => '/view',
0 sẽ trở thành “someType”. Điều này cũng đúng với các hành động, ngoại trừ việc bạn bắt đầu bằng cách bỏ phần "hành động" ban đầu

{TIP} Các tuyến đường có thể được phân biệt chữ hoa chữ thường bằng cách đặt thuộc tính

'<controller:\w+>/<id:\d+>' => '/view',
2 của lớp
'<controller:\w+>/<id:\d+>' => '/view',
1 thành false trong tệp cấu hình của bạn. Tuy nhiên, tôi nghĩ tốt nhất nên coi chúng là phân biệt chữ hoa chữ thường

Tạo URL

Như tôi đã nói ở phần đầu của cuộc thảo luận này, các quy tắc định tuyến phát huy tác dụng khi phân tích cú pháp URL thành các tuyến và cả khi tạo URL dựa trên các tuyến. Bạn phải luôn yêu cầu Yii tạo URL tới bất kỳ trang nào chạy qua tệp bootstrap. Điều này được thực hiện bằng cách sử dụng phương thức

'<controller:\w+>/<id:\d+>' => '/view',
3 hoặc
'<controller:\w+>/<id:\d+>' => '/view',
4 của lớp
'<controller:\w+>/<id:\d+>' => '/view',
5

Trong bộ điều khiển hoặc trong các tệp xem của nó, bạn có thể truy cập nó qua

'<controller:\w+>/<id:\d+>' => '/view',
6. Lưu ý rằng cả hai phương pháp chỉ tạo và trả về một URL, không phải một liên kết HTML

Đối số đầu tiên cho cả hai là một chuỗi biểu thị tuyến đường. Bộ điều khiển và hành động hiện tại được giả định, do đó,

'<controller:\w+>/<id:\d+>' => '/view',
7 trả về URL cho trang hiện tại

Nếu bạn chỉ cung cấp ID hành động, thì bạn sẽ nhận được URL cho hành động đó của bộ điều khiển hiện tại

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
2

Nếu bạn cung cấp một tuyến đường, URL sẽ đến tuyến đường đó

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
3

Nếu URL mong đợi các tham số đã đặt tên được chuyển, hãy thêm các tham số đó vào một mảng làm đối số thứ hai

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
4

Để thực sự hiểu rõ vấn đề, để URL đó hoạt động, phương thức

'<controller:\w+>/<action:\w+>' => '/',
1 của bộ điều khiển phải được viết để chấp nhận tham số
'<controller:\w+>/<action:\w+>' => '/',
2, tham số này có lẽ cũng phù hợp với quy tắc tương ứng

Bạn cũng có thể tạo URL thông qua

# protected/controllers/PageController.php
public function actionView($id) {
    // Etc.
0

'rules'=>array(
    '<controller:\w+>/<id:\d+>' => '/view',
    '<controller:\w+>/<action:\w+>/<id:\d+>' => '/',
    '<controller:\w+>/<action:\w+>' => '/',
),
5

Sự khác biệt chính giữa hai phiên bản của phương pháp

'<controller:\w+>/<id:\d+>' => '/view',
3 là phiên bản
'<controller:\w+>/<id:\d+>' => '/view',
5 có thể được sử dụng mà không cần tham chiếu đến ID bộ điều khiển, trong khi phiên bản
# protected/controllers/PageController.php
public function actionView($id) {
    // Etc.
0 (i. e. , được định nghĩa trong
# protected/controllers/PageController.php
public function actionView($id) {
    // Etc.
4) yêu cầu cung cấp ID bộ điều khiển

Làm cách nào để tạo URL trong Yii2?

Ví dụ: bạn có thể sử dụng mã sau để tạo URL cho hành động đăng/xem. sử dụng yii\helpers\Url; . to() gọi UrlManager. createUrl() để tạo URL $url = Url. to(['post/view', 'id' => 100]);

Làm cách nào để lấy dữ liệu bài đăng trong Yii2?

Để lấy tham số yêu cầu, bạn có thể gọi các phương thức get() và post() của thành phần yêu cầu . Chúng trả về các giá trị của $_GET và $_POST tương ứng.

Làm cách nào để tạo API REST trong Yii2 nâng cao?

Thiết lập API RESTful trong Yii2 .
Cài đặt ứng dụng Yii2. Tất nhiên, bước đầu tiên của chúng ta là cài đặt ứng dụng Yii2. .
Khởi tạo cấu hình. .
Tạo thư mục API. .
Tạo bảng quốc gia. .
Tạo mô hình quốc gia. .
Tạo bộ điều khiển quốc gia. .
Thêm mô-đun và quy tắc API. .
Thêm bí danh API

Yii2 có phải là một framework tốt không?

Vâng, chính là. Yii là một khung PHP nhanh, an toàn và hiệu quả . Linh hoạt nhưng thực dụng. Hoạt động ngay lập tức.