用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2450|回复: 5
收起左侧

[已解决] 如何在查询字符串和分段URL间自由切换?

[复制链接]
发表于 2014-12-25 10:45:06 | 显示全部楼层 |阅读模式
我们知道CodeIgniter的URL一般是这样的:

PHP复制代码
[color=#02166]example.com/class/function/ID
复制代码



当我们启用查询字符串后,URL是这样的:


PHP复制代码
[color=#02166]index.php?c=products&m=view&id=345
复制代码



是否启用查询字符串,在config.php中设置:

PHP复制代码
[color=#02166]$config['enable_query_strings'] = FALSE;
复制代码



我的问题是,如果我需要我的程序可以在两种模式下切换。


那么在试图中所有使用到URL的地方,是不是都需要自己手动构建URL,像下面这样:


PHP复制代码
 
if($this->config->item('enable_query_strings') == "TRUE")
{
      $view_url = $this->config->item('base_url') . "index.php?c=view&id=" . $value['ID'];
 }
 else
{
     $view_url = site_url('view/' . $value['ID']);
}
 
 
复制代码




有其他更好的解决办法么?


我尝试着扩展URL辅助函数,希望能写出一个函数自动处理这种情况:


PHP复制代码
 
if ( ! function_exists('xixi_url'))
{
        function xixi_url($uri = '')
        {
                $CI =& get_instance();
                if($CI->config->item('enable_query_strings') == "TRUE")
                {
                        return $CI->config->item('base_url') . "index.php?c=" . $uri;
                }
                else
                {
                        return $CI->config->site_url($uri);
                }
        }
}
 
 
复制代码




很明显没能解决这个问题。求大神指点。

另外,在启用了查询字符串后,我们在控制器中只能使用get方式接收参数

我写了这么一个函数来处理:

PHP复制代码
 
if ( ! function_exists('xixi_argv'))
{
        function xixi_argv($argv = '', $argc = '')
        {
                $CI =& get_instance();
                if($CI->config->item('enable_query_strings') == "TRUE")
                {
                        return $CI->input->get($argc);
                }
                else
                {
                        return $argv;
                }
        }
}
 
 
复制代码



在控制器的函数中这样调用:

PHP复制代码
 
public function search($search = "")
{
        $search = xixi_argv($search,'search');
 
}
 
复制代码



这样就可以在两种模式下都接收到正确的参数的值了。






发表于 2014-12-25 11:25:21 | 显示全部楼层
GET 传参跟 URI 分段传参形式上不一样,所以传递到控制器方法中的参数也不应该是一样的,因为 GET 传参是 key value 的形式,而分段是类似数组的形式,所以要使用一种互相都兼容的接收参数的形式。
 楼主| 发表于 2014-12-25 11:39:12 | 显示全部楼层
Hex 发表于 2014-12-25 11:25
GET 传参跟 URI 分段传参形式上不一样,所以传递到控制器方法中的参数也不应该是一样的,因为 GET 传参是 k ...

我这样的处理好么?
发表于 2014-12-25 11:42:49 | 显示全部楼层
dolphin 发表于 2014-12-25 11:39
我这样的处理好么?

我感觉这样略显冗余
 楼主| 发表于 2014-12-25 11:49:06 | 显示全部楼层
Hex 发表于 2014-12-25 11:42
我感觉这样略显冗余

是的。我也这样认为。

需要在每个函数中这样处理参数感觉就很奇怪。

你说的兼容两个传参方式的接收参数的方法。


不知道怎么做。请指点一下。
发表于 2014-12-25 18:34:24 | 显示全部楼层
dolphin 发表于 2014-12-25 11:49
是的。我也这样认为。

需要在每个函数中这样处理参数感觉就很奇怪。

我觉得应该定下规范才可以把两个不同的东西统一。
一般来说,我的做法是参数都使用 GET 方式接收,而 URI 分段只用于控制器方法,也就是 http://domain.com/index.php/控制器/方法?参数1=值1&参数2=值2

本版积分规则