2016-06-30 16 views
5

Tôi đang làm việc với Yii2 và tôi muốn sử dụng urlManager với định tuyến để chuyển đổi tất cả ký tự không phải chữ và số không thành dấu gạch chéo. Tôi đã xem xét rất nhiều câu hỏi đã được yêu cầu (#1, #2, #3, #4) nhưng không giải quyết được vì chúng hiển thị một chút tương tự nhưng không phải những gì tôi muốn hoặc không làm việc cho tôi chút nào.Yii2 URL đẹp: tự động chuyển đổi mọi thứ với dấu gạch chéo (bao gồm tất cả các tham số)

tôi có quy tắc urlManager đơn giản:

//... 
'urlManager' => [ 
    'class' => 'yii\web\UrlManager', 
    'enablePrettyUrl' => true, 
    'showScriptName' => false, 
    'rules' => array(
     '<controller:\w+>/<id:\d+>' => '<controller>/view', 
     '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>', 
     '<controller:\w+>/<action:\w+>' => '<controller>/<action>', 
    ), 
], 

.htaccess (cũng đơn giản):

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 

Trong trường hợp của tôi, URL xấu xí của tôi là thế này (SiteController -> public function actionTestRouter()):

localhost/frontend/web/index.php?r=site%2Ftest-router&ident=10&token=ADB&module=P120

Với các quy tắc tôi đã viết ở trên, tôi nhận được kết quả tốt hơn (vì nó xóa index.php?r= và chuyển đổi %2F để /):

localhost/frontend/web/site/test-router?ident=10&token=ADB&module=P120

Những gì tôi muốn nhận được:

localhost/frontend/web/site/test-router/ident/10/token/ADB/module/P120

nhiều attemps của tôi với quy tắc là:

'test-route/<ident:\d+>/<token:\w+>/<module:\w+>' => 'test-route' // 1 
'<controller:\w+>/<action:\w+>/<ident:\d+>/<token:\w+>/<module:\w+>' => '<controller>/<action>' // 2 
'<controller:\w+>/<action:\w+>/<slug:[a-zA-Z0-9_-]+>/' => '<controller>/<action>/<slug>' // 3 (not even sure what slug does here 

Nó cũng sẽ là siêu đẹp nếu sẽ áp dụng các quy tắc với bất kỳ thông số và giá trị nào, bất kể tên và giá trị của chúng.

Trả lời

5

nỗ lực thứ hai của bạn

'<controller:[\w\-]+>/<action:[\w\-]+>/<ident:\d+>/<token:\w+>/<module:\w+>' => '<controller>/<action>' // 2 

sẽ mất/tạo url

localhost/frontend/web/site/test-router/10/ADB/P120

mà không cần tên của params trong url và những params sẽ chỉ được sử dụng theo thứ tự này và danh sách của họ là cố định như bạn thấy

Nếu bạn muốn thêm tên của họ vào url (cho mục đích estetic hoặc seo như trong câu hỏi của bạn):

'<controller:[\w\-]+>/<action:[\w\-]+>/ident/<ident:\d+>/token/<token:\w+>/module/<module:\w+>' => '<controller>/<action>', // 2 

Và url tạo cho các đường bay sẽ giống nhau:

echo Url::to(['site/test-router', 'ident' => 100, 'module' => 100, 'token' => 100]); 

Nếu bạn muốn phân tích chiều dài khác nhau của danh sách này của params, bạn có thể sử dụng smth như thế này:

'<controller:[\w\-]+>/<action:[\w\-]+>/<params:[a-zA-Z0-9_\-\/]+>' => '<controller>/<action>' 

hoặc chỉ định nó chỉ cho một con đường:

'site/test-route/<params:[a-zA-Z0-9_\-\/]+>' => 'site/test-route' 

vì vậy, trong hành động mà bạn sẽ nhận được thông số params: Yii::$app->request->get('params'); phân tích cú pháp bằng regexp.

+0

Cảm ơn câu trả lời. Nhưng tôi nhận được lỗi này: 'preg_match(): Biên dịch thất bại: phạm vi thứ tự trong lớp nhân vật ở mức bù 66' khi thử tùy chọn cuối cùng hoặc thứ hai cuối cùng. :/ –

+0

Ah từ 5.2 trừ đi cũng nên được thoát. Đã chỉnh sửa câu trả lời. – user1852788

+0

Tôi vẫn không hiểu đúng.:/Tôi đã thử chỉnh sửa của bạn và nhập 'localhost/frontend/web/site/kiểm tra-router/ident/10/token/ADB/module/P120' (trực tiếp vào URL) nhưng tôi nhận được lỗi' 404'. –

Các vấn đề liên quan