【问题标题】:Codeigniter URI routing with for multiple methods用于多种方法的 Codeigniter URI 路由
【发布时间】:2016-01-16 18:46:00
【问题描述】:

我正在开发 codeigniter。控制器名称为“project”,共有 4 个函数。“get_city_data”、“get_store_data”、“get_currency”、“get_description”。

我在上面两个函数中传入的参数是-get_city_data($state, $city), get_place_data($state, $city, $store)。

所以在浏览器上呈现这些功能我分别使用网址作为-

http://localhost/project/get_city_data/state1/city1

我想更改网址,例如 http://localhost/state1/city1

如果我在 routes.php 中定义这样的路由 $route['(:any)/(:any)'] = 'project/get_city_data/$1/$2' 然后它也反映了所有其他函数,但我只想更改这两个函数的 url。

我也不想使用 _remap 函数,因为它不能很好地满足我的需求。

有人可以帮我吗? 谢谢你

【问题讨论】:

标签: codeigniter-2


【解决方案1】:

我建议你先检查数据库,然后确定需要的路线。这是我对您要求的回答。

在您的 routes.php 中,尝试以下代码:

require_once( BASEPATH . 'database/DB' . EXT );

$url_source = $_SERVER['REDIRECT_URL'];
$arr_url = explode("/", $url_source);

$state_name = $arr_url[3];
$city_name  = $arr_url[4];
$store_name = $arr_url[4];

$db = & DB();

//Let say grab 3 columns to be check
$db->select('state_name, city_name, store_name');


if(!empty($state_name)):
    $db->where('state_name', $state_name);
endif;

if(!empty($city_name)):
    $db->where('city_name', $city_name);
endif;

if(!empty($store_name)):
    $db->where('store_name', $store_name);
endif;

$query = $db->get('table', 1);
$obj = $query->row();
if ($obj):
    $route["$obj->state_name/$obj->city_name/$obj->store_name"] = "project/get_city_data/$state_name/$city_name/$store_name";
endif;

你可以通过这个网址试试:

http://localhost/state_name/city_name/store_name

【讨论】:

  • 我已经试过了。我正在使用另一个函数获取有效负载,如果我在 route.php 中进行这些更改,该函数不会提供数据
  • 简单的问题是我们是否可以通过匹配正则表达式中的函数名称或类似 django 允许的东西来制作仅在函数中传递的参数而不给出任何控制器或函数名称的 url。
【解决方案2】:

我用正则表达式解决了它。

在 routes.php 我写了

$url_source = $_SERVER['REQUEST_URI'];
if(!(preg_match('%^/project/get_description\?state=[a-zA-Z_-]*%', $url_source) || preg_match('%^/project/get_currency\?state=[a-zA-Z_-]*%', $url_source))){

        if(!preg_match('%^\/[a-zA-Z_-]+\/[a-zA-Z_-]+\/[a-zA-Z_-]+$%', $url_source)){
                $route['(:any)/(:any)'] = 'project/get_city_data/$1/$2';
        }else{
                $route['(:any)/(:any)/(:any)'] = 'project/get_store_data/$1/$2/$3';
        }
}

通过这种方式,我能够为特定功能进行路由。

【讨论】:

    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2011-03-07
    相关资源
    最近更新 更多