2016-06-30 4 views
5

Ich arbeite mit Yii2 und ich würde gerne URL-Manager mit Routing verwenden, um alle Nicht-Buchstaben und Nicht-Nummer Zeichen in Schrägstriche zu konvertieren. Ich habe mir viele Fragen angeschaut was schon gefragt wurde (#1, #2, #3, #4) aber keiner hat es gelöst da sie entweder ein wenig ähnliches zeigen aber nicht das was ich will oder nicht für mich überhaupt funktioniert.Yii2 hübsche URL: automatisch alles mit Schrägstrichen konvertieren (einschließlich aller Parameter)

ich einfach urlManager Regeln:

//... 
'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 (auch einfach):

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 

In meinem Fall meine hässliche URL ist dies (SiteController -> public function actionTestRouter()):

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

Mit Regeln, die ich oben geschrieben habe, bekomme ich besseres Ergebnis (weil es index.php?r= entfernt und konvertiert %2F zu /):

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

Was ich zu bekommen:

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

Meine mehrere Anläufe mit Regeln waren:

'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 

Es ist auch super nett wäre, wenn die Regeln gelten würden zu irgendwelchen Parametern und Werten, unabhängig von ihrem Namen und Werten.

Antwort

5

Ihr zweiter Versuch

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

nehmen/erstellen Urls

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

ohne Namen params in URL und diese params werden nur in dieser Reihenfolge und ihre Liste festgelegt werden, wie Sie sehen,

Wenn Sie ihre Namen in URL hinzufügen möchten (für Estetic oder SEO Zwecke wie in Ihrer Frage):

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

und URL-Erstellung für diese Strecken wird gleich sein:

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

oder angeben:

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

Wenn Sie verschiedene Länge dieser Liste von params analysieren möchten, können Sie smth wie diese verwenden können es nur für eine Strecke:

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

So in Aktion finden Sie Parameter params erhalten: Yii::$app->request->get('params'); parse es mit regexp.

+0

Danke für die Antwort. Aber ich habe diesen Fehler: 'preg_match(): Kompilierung fehlgeschlagen: Bereich außerhalb der Reihenfolge in der Zeichenklasse bei Offset 66 'beim Versuch der letzten oder vorletzten Optionen. :/ –

+0

Ah seit 5.2 minus sollte auch maskiert werden. Antwort bearbeitet. – user1852788

+0

Ich verstehe es immer noch nicht richtig.:/Ich habe versucht, Ihre Bearbeitung und eingegeben 'localhost/Frontend/Web/Site/Test-Router/Ident/10/Token/ADB/Modul/P120' (direkt in URL), aber ich bekomme' 404' Fehler. –

Verwandte Themen