2016-06-30 110 views
5

Yii2 ile çalışıyorum ve tüm harf olmayan ve sayı olmayan karakterleri eğik çizgilere dönüştürmek için yönlendirme ile urlManager kullanmak istiyorum. Daha önce sorulan sorulara çok fazla baktım (#1, #2, #3, #4) ama hiçbiri ya küçük bir benzerlik gösterdiği için değil, benim istediğim ya da çalışmadığım için çözemediler.Yii2 güzel URL: otomatik olarak her şeyi eğik çizgi ile dönüştür (tüm parametreler dahil)

(aynı zamanda basit)
//... 
'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>', 
    ), 
], 

.htacces:

Basit urlManager kuralları vardır

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

: Benim durumumda

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 

, benim çirkin URL (SiteController -> public function actionTestRouter()) 'dir

Yukarıda yazdığım kurallarda daha iyi sonuç aldım (çünkü index.php?r='u kaldırır ve dönüştürür %2F) / için:

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

Almak istediğim Ne:

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

Benim birkaç girişimi kurallara vardı:

'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 

kuralları geçerli olsaydı Ayrıca süper güzel olurdu Adlarına ve değerlerine bakılmaksızın herhangi bir parametreye ve değerlere.

cevap

5

Kişisel ikinci girişim

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

oluşturmak/alacak url params adları olmadan URL'ler

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

ve bu parametreler bu sırada sadece kullanılacak ve gördüğünüz gibi kendi listesini sabittir

Adlarını URL'lere eklemek isterseniz (sorunuzdaki gibi estetik veya seo amaçları için):

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

Ve url oluşturma aynı olacaktır:

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

veya belirtin: Eğer params bu listenin değişik uzunlukta ayrıştırmak istiyorsanız, böyle smth kullanabilirsiniz

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

sadece bir yol için:

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

Yani eylem parametreyi params alacak: Yii::$app->request->get('params'); regexp ile ayrıştırın.

+0

Cevabınız için teşekkürler. Ama ben bu hatayı aldım: 'preg_match(): Derleme başarısız oldu: son veya ikinci son seçenekleri denerken, offset 66'da karakter sınıfında sıra dışı. :/ –

+0

Ah, 5.2'den beri aynı zamanda kaçmış olmalı. Cevap düzenlendi. – user1852788

+0

Hala doğru anlamıyorum.:/Düzenlemeyi denedim ve 'localhost/frontend/web/site/test-router/ident/10/token/ADB/module/P120' (doğrudan URL'ye) girdim ama' 404' hatası alıyorum. –