【问题标题】:Custom Query Parameters without Appending Them to URL自定义查询参数而不将它们附加到 URL
【发布时间】:2012-09-05 16:40:20
【问题描述】:

我在urlManager 中有'urlFormat'=>'path' 和'showScriptName'=>false。

我有代理/读取作为控制器/动作和 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>',
),

但它们似乎不起作用。

【问题讨论】:

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


    【解决方案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>',
      ),
      

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

      在视图中创建 url:

      $this->createUrl('proxies/read', array('article'=>$name));
      
    3. 如果您不需要任何默认的“user-friendly url”规则,而只需要路径格式的 url,那么您只需指定 'urlFormat'=&gt;'path' 并将 'rules' 数组留空或全部省略在一起。

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

    【讨论】:

    • 尝试所有 3 种方法,然后选择最适合您的一种
    【解决方案2】:

    试试这些规则

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

    【讨论】:

      【解决方案3】:

      不需要规则..

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

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

      对于 createUrl()。给它一个 key=>value 参数数组作为第二个参数

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

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 2023-03-28
        • 2015-12-26
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 2014-11-28
        相关资源
        最近更新 更多