Возможна ли динамическая маршрутизация URI CodeIgniter?


Мое приложение предназначено для предоставления одной страницы профиля для каждого пользователя, причем 3-й сегмент является идентификатором пользователя.

example.com/profile/page/1

Предполагая, что пользователь 1 - "Джон Джови", используя маршрутизацию CI, я хотел бы сгенерировать этот URI

example.com/jon_jovi

Можно ли отправить идентификатор этого пользователя в config/routes.php, запустить функцию для извлечения информации о пользователе 1 из базы данных и вставить ее как

$route['profile/page/$row->id'] = $row->first_name . '_' . $row->last_name;

Любые мысли или предложения о том, как это сделать, очень ценятся - спасибо.

Author: pepe, 2011-06-03

3 answers

Если вы хотите, чтобы URL-адрес "клиента" был в формате base_url/[username], вам, вероятно, потребуется захватить имя пользователя с помощью маршрутизации регулярных выражений, например $route['([a-zA-z_]+)'] = "profile/page/$1";, и поискать этого пользователя в своей базе данных.

Другим решением было бы добавить идентификатор к URL-адресу, например base_url/[username]/[id]. Для этого регулярное выражение $route['([a-zA-z_]+)/([0-9+])'] = "profile/page/$2"; передало бы идентификатор в качестве первого параметра для функции страницы контроллера профиля.

Проверьте документацию для получения более подробной информации о динамической маршрутизации: http://codeigniter.com/user_guide/general/routing.html

 4
Author: JulioC, 2011-06-03 04:17:29

Не уверен, что это вообще должно быть в вашем config/routes.php: почему бы вам просто не создать контроллер, который принимает имя и выполняет поиск?

ПРАВКА: Я беру свои слова обратно. На самом деле это довольно болезненно, особенно потому, что вы хотите, чтобы он находился в корне домена (т.Е. Это было бы легко сделать example.com/p /{имя пользователя}, ноexample.com /{имя пользователя} беспорядочно).

Самый простой способ сделать это - использовать возможность CodeIgniter 2.0+ для переопределения обработчика 404 и функция _remap. Во-первых, сделайте это в config/routes.php файл:

$route['404_override'] = 'notfound';

Затем создайте контроллер:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class NotFound extends CI_Controller
{
  function __construct()
  {
    parent::__construct();
  }

  public function _remap($method)
  {
    if($this->uri->total_segments() == 1){
      // try it out
      $this->profile();
    }else{
      show_404($this->uri->uri_string());
    }
  }

  function profile()
  {
    echo "Showing profile for [" . $this->uri->segment(1) . "]";
  }
}

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

Дайте мне знать, если это сработает для вас.

 5
Author: Femi, 2011-06-03 05:48:26

Несколько недель назад был аналогичный вопрос. Я скопировал соответствующую часть моего ответа ниже:

Вы захотите расширить маршрутизатор CI и при входящем запросе запросить в базе данных список названий компаний. Если сегмент URI соответствует названию компании, вы захотите предоставить его, используя метод вашей компании/профиля. Если это не так, вы проигнорируете это и позволите CI справиться с этим нормально. Ознакомьтесь с этим сообщением по этой теме для получения дополнительной информации информация: ссылка на форум.

В этом случае просто замените "компания" и "компания/профиль" на "имя пользователя" и "профиль/страница", чтобы это соответствовало вашему вопросу.

 0
Author: Sean Walsh, 2017-05-23 11:53:02