Возможна ли динамическая маршрутизация 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;
Любые мысли или предложения о том, как это сделать, очень ценятся - спасибо.
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
Не уверен, что это вообще должно быть в вашем 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, поскольку это переопределяет ее, но сюда поступают любые запросы, которые не сопоставляются с существующим контроллером, и вы можете отправлять их так, как хотите, включая перевод имени в идентификатор базы данных.
Дайте мне знать, если это сработает для вас.
Несколько недель назад был аналогичный вопрос. Я скопировал соответствующую часть моего ответа ниже:
Вы захотите расширить маршрутизатор CI и при входящем запросе запросить в базе данных список названий компаний. Если сегмент URI соответствует названию компании, вы захотите предоставить его, используя метод вашей компании/профиля. Если это не так, вы проигнорируете это и позволите CI справиться с этим нормально. Ознакомьтесь с этим сообщением по этой теме для получения дополнительной информации информация: ссылка на форум.
В этом случае просто замените "компания" и "компания/профиль" на "имя пользователя" и "профиль/страница", чтобы это соответствовало вашему вопросу.