自定义查询参数,但不将它们附加到URL

时间:2012-09-12 15:45:20

标签: mod-rewrite url-rewriting yii url-routing

'urlFormat'=>'path'中有'showScriptName'=>falseurlManager

我有代理/读取控制器/操作和article => some_name作为参数。

每当我创建一个链接,例如: $ this-> createUrl('proxies / read',array('article'=> $ name));

结果是类型为的URL:

proxies/read?article=socks5_proxy_list

我想转储查询参数并重新格式化URL,如下所示:

controller/action/param_name/param_value

在这种情况下:

proxies/read/article/socks5_proxy_list

我目前的“规则”如下:

'rules'=>array(
  '<controller:\w+>/<id:\d+>'=>'<controller>/view',
  '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
  '<controller:\w+>/<action:\w+>/article/<article:\w+>'=>'<controller>/<action>/article/<article>',
  '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),

但他们似乎没有工作。

3 个答案:

答案 0 :(得分:1)

  1. 使这项工作的捷径:

    $this->createUrl('proxies/read/article/'.$name);
    

    并保留urlManager规则,而不使用自定义规则。

  2. 另一种方式:

    // urlManager
    'rules'=>array(// order of rules is also important
      '<controller:\w+>/<action:\w+>/article/<article:\w+>'=>'<controller>/<action>',
      '<controller:\w+>/<id:\d+>'=>'<controller>/view',
      '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
      '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
    ),
    

    在上面的数组中,我只是将新规则放在开头,以确保在遇到这种模式时应用该规则。如果您有其他规则,那么只需确保此规则出现在更符合模式的更一般规则之前。经验法则:在一般规则之前应该出现更具体的规则。

    在视图中创建网址:

    $this->createUrl('proxies/read', array('article'=>$name));
    
  3. 如果您不需要任何默认的“user-friendly url”规则,但只需要路径格式网址,那么您只需指定'urlFormat'=>'path'并离开{{1}数组为空或一起省略。

  4. 如果您还没有,请阅读权威指南中的URL Management guide

答案 1 :(得分:0)

不需要规则..

http://yourhost.com/mycontroller/dosomething/param1/value/param2/value

class MyController extends Controller {
   public function actionDosomething($param1, $param2) {
   }
}

和createUrl()一样。将一个key =&gt;值数组参数作为第二个参数

http://www.yiiframework.com/doc/api/1.1/CController#createUrl-detail

答案 2 :(得分:0)

尝试这些规则

'rules'=>array(
  '<controller:\w+>/<id:\d+>'=>'<controller>/view',
  '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',  
  '<controller:\w+>/<action:\w+>/*'=>'<controller>/<action>',
),