使用URL中的冒号在Codeigniter中进行路由:

时间:2015-03-05 12:37:21

标签: php codeigniter routing

此路线

$route['api2/(:any)'] = "api2/api2/$1/";

匹配以下网址:

/api2/pictures/alpha_string
/api2/pictures/picture_id:alpha_string

但不是这一个:

/api2/pictures/picture_id:55

不同之处在于我在“:”之后使用数字。

如何使其与最后一个网址匹配?

由于

1 个答案:

答案 0 :(得分:0)

如果要在代码点火器URL中使用冒号(:)字符,则可以从以下说明中扩展 CI_Router CI_URI 类:

首先,在“ 应用程序/核心”文件夹中创建新文件“ MY_Router.php ”:

<?php defined('BASEPATH') or exit('No direct script access allowed');

class MY_Router extends CI_Router
{
    protected function _set_request($segments = [])
    {
        parent::_set_request($segments);
        $this->_set_params($segments);
    }
    protected function _set_params($params = [])
    {
        foreach($params as $key => $value) {
            if( FALSE !== strpos($value, ':') && preg_match('/^([a-z0-9\-_]+)\:(.*)$/iu',$value,$m) ) {
                $this->uri->params[$m[1]] = $m[2];
                unset($params[$key]);
                continue;
            }
        }
    }
}

第二,在“ 应用程序/核心”文件夹中创建另一个文件“ MY_URI.php ”:

<?php defined('BASEPATH') or exit('No direct script access allowed');

class MY_URI extends CI_URI
{
    public $params = [];

    public function param($n, $no_result = NULL)
    {
        return isset($this->params[$n]) ? $this->params[$n] : $no_result;
    }
}
function param($n, $no_result = NULL)
{
    return get_instance()->uri->param($n, $no_result);
}

仅此而已,现在您可以考虑以下示例来获取单独的url参数:

$param1 = $this->uri->param('param1') // output = value1
$param2 = $this->uri->param('param2') // output = value2
$param3 = $this->uri->param('param3') // output = null
$param4 = $this->uri->param('param4', 1) // output = 1

$param1 = param('param1') // output = value1
$param2 = param('param2') // output = value2
$param3 = param('param3') // output = null
$param4 = param('param4', 1) // output = 1

此外,我已经编写了一个小库来处理在URL中使用冒号,您可以在以下github存储库中找到它:Codeigniter Colon URI