Smart URLs mit Yii
Die URLs in Yii haben normalerweise den folgenden Aufbau:
- index.php?r=site/contact
- index.php?r=site/contact&p=1
Hier werden jeweils die contactAction des siteControllers ausgeführt. Im unteren Beispiel wird noch ein Parameter p mitgegeben, der per
$p = Yii::app()->request->getParam("p");
abgefragt werden kann
Dieser Aufruf kann auch mit default-Werten arbeiten.
$p = intval(Yii::app()->request->getParam("p", 0));
Wird der Parameter p weggelassen, ist er eben 0.
Nun gibts auch noch die UrlManager-Komponente, die sich folgendermaßen in der config festlegen läßt.
'urlManager' => array( 'urlFormat' => 'path' ),
somit sehen dann die URLs von oben folgendermaßen aus:
- index.php/site/contact
- index.php/site/contact/p/1
das index.php bekommt man mit zwei Schritten weg.
1. .htaccess
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.php2. config/main.php:
'urlManager'=>array( 'urlFormat' => 'path', 'showScriptName' => false ),
jetzt haben wir nur noch
- /site/contact
- /site/contact/p/1
Zum Schluss wollen wir noch ein paar “rules” definieren.
ich will ein Benutzerprofil anzeigen, würde normalerweise so aussehen:
- /user/show/id/589
Hier wird das Profil des Benutzers mit der id = 589 angezeigt, indem die ShowAction des UserControllers ausgeführt wird.
wir möchten allerdings folgende Urls
- /profile/mbischof
- /profile/mbischof/guestbook
- /profile/mbischof/galery
Dafür konfigurieren wir den UrlManager wie folgt:
'urlManager' => array( 'urlFormat' => 'path', 'showScriptName' => false, 'rules' => array( 'profile/<username>' => 'user/show' 'profile/<username>/guestbook' => 'guestbook/list' 'profile/<username>/galery' => 'image/list' ) ),
vorrausgesetzt, wir haben einen GuestbookController bzw ImageController mit den entsprechenden Actions. Das Prinzip sollte klar sein.
In der ShowAction des UserControllers erhalten wir den Bentuzername so:
$username = Yii::app()->request->getParam("username", "");
Verwandte Artikel:
- Yii Message Translation
- Einfache Seiten
- Yiiframework Events
- Models aus Modulen verwenden
- Ein Modul als Admin Backend
- yiic shell
- Mit Yii eine Datei hochladen
- Widgets
- Gegen DB authentifizieren
- Ajax Updates
- Yii Module
- Erste Schritte mit Yii
- Parameterized Named Scopes
- Webservice mit Yii
- Erste Schritte mit Yii Teil 2
Letzte Kommentare