Yii路由器规则将关键字重定向到动作的$ _GET参数

时间:2014-10-10 10:51:56

标签: yii yii-url-manager yii-routing

在Yii中,是否可以使用路由器规则将URL中的关键字“转换”为某个操作的$ _GET Parametric?

我想要的是让这个网址:

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

指向:

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

其中foo指向12

而且,由于我使用的是“路径”urlFormat,并且正在使用其他网址规则隐藏indexid=,因此上述网址最终应指向:

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

是否可以通过在配置文件中为urlManager组件设置规则?

1 个答案:

答案 0 :(得分: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',

还有一点需要注意,如果您要使用此路径,请确保slug在您的数据库中是唯一的,您还应该在模型中强制执行验证规则:

    array('slug', 'unique'),