所以,使用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;
}
答案 0 :(得分:0)
您可能需要重写URL条件,因此请求仍然会路由回index.php。
查看本指南:http://www.yiiframework.com/doc/guide/1.1/en/topics.url#user-friendly-urls
答案 1 :(得分:0)
查看actionView
PersonController
public function actionView($id,...)
{
}
因此,视图操作必须有一个$id
参数才能生效。否则会抛出400错误的请求错误。在您修改的网址规则中,指定的唯一参数是$last
和$name
。解决方案是将$id
参数移除到actionView()
,如果actionView
内未使用该参数。否则,您必须更改功能逻辑,以便从$last
和$name
而非$id
答案 2 :(得分:0)
您的视图操作需要接受名称并按属性进行查找,而不是使用loadModel,这需要ID:
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,
));
}
请注意,您的请求不会支持具有相同名字和姓氏的多个人!