为了账号安全,请及时绑定邮箱和手机立即绑定

codeigniter 3 URI 路由 - 从给定的 url 获取右侧

codeigniter 3 URI 路由 - 从给定的 url 获取右侧

PHP
素胚勾勒不出你 2023-04-21 16:29:22
我需要在 Codeigniter 3 中模拟路由,所以我的问题是如何以编程方式从任何 URL 获取右侧?例如,我有一些路线:$route["blog"] = "Main/blog/en";$route["blog/(:any)"] = "Main/blog/en/$1";$route["novosti"] = "Main/blog/sr";$route["novosti/(:any)"] = "Main/blog/sr/$1";$route["contact"] = "Main/contact/en";$route["kontakt"] = "Main/contact/sr";现在我需要一个可以为给定 URL 部分返回右侧的函数,如下所示:echo $this->route->item("novosti/petar")然后应该打印 Main/blog/sr/$1 或 Main/blog/sr/petarCodeigniter 中是否有这样的功能,因为我在文档中找不到它?更新: 我正在查看整个系统/路由器类,我看到受保护的函数 _parse_routes 正在做类似的事情,所以如果没有函数可以给我我需要的东西,我将基于这个创建一个。
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

您可以使用以下代码获取所需的信息。

$this->router->routes['novosti/(:any)'];


查看完整回答
反对 回复 2023-04-21
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

用这个

$this->router->routes['blog']

你会得到

Main/blog/en


查看完整回答
反对 回复 2023-04-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

Codeigniter 很简单,太简单了...而且因为对我来说这个函数在哪里并不明显(如果存在的话)我刚刚采用 _parse_routes 将 URL(slug)解析到我可以找到的右侧相应的文件就容易多了。


在这里(如果有人遇到与我相同的情况)。


  function parseRoute($uri) {


    // Get HTTP verb

    $http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli';


    // Loop through the route array looking for wildcards

    foreach ($this->router->routes as $key => $val) {

      // Check if route format is using HTTP verbs

      if (is_array($val)) {

        $val = array_change_key_case($val, CASE_LOWER);

        if (isset($val[$http_verb])) {

          $val = $val[$http_verb];

        } else {

          continue;

        }

      }


      // Convert wildcards to RegEx

      $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);


      // Does the RegEx match?

      if (preg_match('#^' . $key . '$#', $uri, $matches)) {

        // Are we using callbacks to process back-references?

        if (!is_string($val) && is_callable($val)) {

          // Remove the original string from the matches array.

          array_shift($matches);


          // Execute the callback using the values in matches as its parameters.

          $val = call_user_func_array($val, $matches);

        }

        // Are we using the default routing method for back-references?

        elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE) {

          $val = preg_replace('#^' . $key . '$#', $val, $uri);

        }


        return $val;

      }

    }


    // If we got this far it means we didn't encounter a

    // matching route so we'll set the site default route

    return null;

  }

现在,这个:


echo parseRoute("novosti/petar")

将产生:


Main/blog/sr/petar

又名:控制器类/该控制器内的函数/语言参数/博客文章


查看完整回答
反对 回复 2023-04-21
  • 3 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信