Возможна ли динамическая маршрутизация URI CodeIgniter? - PullRequest
2 голосов
/ 03 июня 2011

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

example.com/profile/page/1

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

example.com/jon_jovi

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

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

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

Ответы [ 3 ]

5 голосов
/ 03 июня 2011

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

РЕДАКТИРОВАТЬ: я забираю его обратно.Это на самом деле довольно болезненно, особенно потому, что вы хотите, чтобы он находился в корне домена (то есть было бы легко сделать example.com / p / {username} , но example.com/ enjusername…**************.

Самый простой способ сделать это - использовать способность CodeIgniter 2.0 + переопределить обработчик 404 и функцию _remap.Сначала сделайте это в файле config / rout.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, поскольку это переопределяет ее, но сюда поступают любые запросы, которые не отображаются на существующий контроллер, и вы можете отправлять их по своему усмотрению, включая преобразование имени в идентификатор базы данных.

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

4 голосов
/ 03 июня 2011

Если вы хотите, чтобы 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

0 голосов
/ 03 июня 2011

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

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

В этом случае просто замените «company» и «company / profile» на «username» и «profile / page», чтобы они соответствовали вашему вопросу.

...