codeigniter 3 URI routing - получение правой части из заданного URL - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно смоделировать маршрутизацию в 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 / petar

Есть ли такая функция в Codeigniter, потому что я не могу найти ее в документации?

ОБНОВЛЕНИЕ: Я просматриваю класс системы / маршрутизатора и вижу эта защищенная функция _parse_routes делает нечто подобное, поэтому, если нет функции, которая может дать мне то, что мне нужно, я создам ее на основе этой.

Ответы [ 3 ]

0 голосов
/ 30 мая 2020

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

AKA: класс / функция контроллера внутри этого контроллера / языковой параметр / статья в блоге

0 голосов
/ 31 мая 2020

Вы можете получить необходимую информацию, используя приведенный ниже код.

$this->router->routes['novosti/(:any)'];
0 голосов
/ 30 мая 2020

используйте это

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

вы получите

Main/blog/en

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...