【问题标题】:configuring route in CI to accept n level of url's在 CI 中配置路由以接受 n 级 url
【发布时间】:2017-10-18 19:08:30
【问题描述】:

我有一个完全动态的网站,它创建菜单,从后端动态地对所有内容进行分页。 现在让我向您展示创建 URL 的顺序:

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

基本上 level1level2、... 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,它会显示找不到页面!

【问题讨论】:

    标签: codeigniter routes


    【解决方案1】:

    如果你使用的是 ci 3,你可以使用regular expressionslike

    application/config/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;
                     }
    

    应用程序/config/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
    }
    

    【讨论】:

    • 是的,我正在使用 C.I 3.X,我收到了通过 implode() 的无效参数
    • 把这个$params = implode(",", $param);改成$params = ( count($param) > 1) ? implode(",", $param) : $params;
    • 是的,我之前忘记了这部分$params = implode... 添加$param = explode('/', $param); 然后$params = implode(...)
    • 嘿,如果你好心回答最后一个问题!我想要做的是 Admin 有一个单独的接口,现在所有与 Admin/... 相关的请求都应该重定向到特定的 Admin 控制器方法,但现在它与我们上面完成的路由混合
    猜你喜欢
    • 2014-04-15
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多