在CI中配置路由以接受n级别的URL

时间:2017-10-18 19:08:31

标签: codeigniter routes

我有一个完全动态的网站,它创建菜单,动态地从后端分页。 现在让我向您展示正在创建的URL序列:

http://localhost/occ/level1/level2/....leveln

基本上 level1 level2 ,... leveln 是特定菜单的级别(层次结构),例如 home / contact_section / contact_us 现在管理员可以创建多个页面并创建他想要的菜单级别,所以URL逻辑是什么,它将继续从父级跟随最后一个父级并返回URL并在最后URL的名称将是我传递给通用控制器的名称,它基本上取名称运行db查询获取所有数据然后显示页面这里是我的路线:

$route['default_controller'] = 'Home';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;
$route['Admin'] = 'Admin';
//$route['(:any)'] = 'Home/pages/$1';
$route['(:any)/(:any)'] = 'Home/pages/$1/$2';
//$route['(:any)/(:any)'] = 'Home/pages/$1';

现在上述路线有两个问题:

  1. 假设我有两个级别的URL,所以路由$ route ['(:any)/(:any)'] ='Home / pages / $ 1 / $ 2';将被调用现在页面控制器接受一个名称并显示页面,在我的情况下,它总是返回名字,或者你可以说$ 1,而我希望URL中的姓氏被发送到控制器。
  2. 我们怎样才能使它成为通用的?就像我可以在URL中用n级别的名称分隔斜杠,如何配置我的路由以接受所有URL,并将URL的姓氏传递给控制器​​。因为如果我在路由中定义了一些其他级别的URL,它当前显示找不到页面!

1 个答案:

答案 0 :(得分:1)

如果您使用的是ci 3,则可以使用regular expressions之类的

应用/配置/ routes.php文件

//http://localhost/occ/level1/level2/....leveln
$route['(.+)'] = function ( $param ) {
                     $params = implode(",", explode('/', $param));

                     if( $params[0] === 'Admin'){
                         $return = 'Admin/';
                     }
                     else{
                         $return = 'Home/pages/';
                     }

                     return $return . $params;
                 }

应用/配置/ Home.php

public function pages ( $params ) {
    $str = explode(',', $params);

    //now you can manipulate all params
    $str[0];//param_1
    $str[1];//param_2
    $str[n];//param_n
}