0

所以,使用 urlManager 我已经能够做到这一点:

'people/<id:\d+>/<last:.*?>/<name:.*?>'=>'person/view',

生成这个:http: //foo.com/people/3/smith/john

我想消除 ID 号,在本例中为“3”

我尝试使用这个:

'people/<last:.*?>/<name:.*?>'=>'person/view', //makes sense right?

但是,当我尝试导航到http://foo.com/people/smith/john时,出现服务器 400 错误。是什么赋予了?我应该尝试修改 .htaccess 文件吗?

这里要求的是我的整个 urlManager 组件:

    'urlManager'=>array(
        'urlFormat'=>'path',
        'showScriptName'=>false,
        'rules'=>array(
            'about' => array('site/page', 'defaultParams' => array('view' => 'about')),
            'contact'=>'site/contact',
            'login' =>'site/login',
            '/'=>'site/index',
            'people/<last:.*?>/<name:.*?>'=>'person/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),
    ),

这是我的 PersonController.php 文件:

public function actionView()
{
    $person=$this->loadModel();
    $this->render('view',array(
        'model'=>$person,
    ));
}

private $_model;

public function loadModel()
{
    if($this->_model===null)
    {
        if(isset($_GET['last']))
        {
            $this->_model=Person::model()->findByPk($_GET['id']);
        }
        if($this->_model===null)
            throw new CHttpException(404,'The requested page does not exist.');
    }
    return $this->_model;
}
4

3 回答 3

0

您可能需要 URL 的重写条件,因此请求仍会路由回 index.php。

查看本指南:http ://www.yiiframework.com/doc/guide/1.1/en/topics.url#user-friendly-urls

于 2012-09-16T03:58:43.333 回答
0

看看actionView_PersonController

public function actionView($id,...)
{

}

所以视图动作必须需要一个$id参数才能工作。否则会抛出 400 bad request 错误。在您修改后的 url 规则中,指定的唯一参数是$last$name。解决的办法是,如果里面没有用到,就去掉$id参数to 。否则,您必须更改功能逻辑来确定所需人员,而不是actionView()actionView$last$name$id

于 2012-09-16T13:40:19.293 回答
0

您的视图操作需要接受名称并通过属性进行查找,而不是使用需要 ID 的 loadModel:

public function actionView($last, $name)
{
    $person = Person::model()->find(
        'name=":name" AND last=":last"',
        array(':name'=>$name, ':last'=>$last)
    );

    if($person === null) throw new CHttpException(404);

    $this->render('view',array(
        'model'=>$person,
    ));
}

请注意,您的请求将不支持多个具有相同名字和姓氏的人!

于 2014-08-25T04:28:46.730 回答