2014-10-10 54 views
0

在Yii中,是否可以使用路由器規則將URL中的關鍵字「翻譯」爲某個動作的$ _GET參數?

我想要什麼,就是讓這個網址:

http://example.com/MyModule/MyController/index/foo

指:

http://example.com?r=MyModule/MyController/index&id=12

其中foo12

而且,由於我使用的「路徑」的網址格式,並使用其它URL規則隱藏indexid=,以上網址最終應指向:

http://example.com/MyModule/MyController/12

這是possibe通過設置規則在urlManager組件的配置文件中?

回答

0

你的行動應該接受一個參數$id

public function actionView($id) { 
    $model = $this->loadModel($id); 

你需要做的,是修改loadModel功能在同一個控制器:

/** 
* @param integer or string the ID or slug of the model to be loaded 
*/ 
public function loadModel($id) { 

    if(is_numeric($id)) { 
     $model = Page::model()->findByPk($id); 
    } else { 
     $model = Page::model()->find('slug=:slug', array(':slug' => $id)); 
    } 

    if($model === null) 
     throw new CHttpException(404, 'The requested page does not exist.'); 

    if($model->hasAttribute('isDeleted') && $model->isDeleted) 
     throw new CHttpException(404, 'The requested page has been deleted for reasons of moderation.'); 

    // Not published, do not display 
    if($model->hasAttribute('isPublished') && !$model->isPublished) 
     throw new CHttpException(404, 'The requested page is not published.'); 

    return $model; 
} 

然後,你將需要修改urlManager規則接受一個字符串,而不僅僅是一個ID:

刪除:\d+在下面的默認規則:

'<controller:\w+>/<id:\d+>' => '<controller>/view', 

它應該是這樣的:

'<controller:\w+>/<id>' => '<controller>/view', 

還有一點要注意,如果你要這條道路,確保塞在你的數據庫中是唯一的,你也應該執行驗證規則在型號中:

array('slug', 'unique'),