2014-11-18 8 views
1

Я создаю семантические URL-маршруты в Codeigniter, где я извлекаю данные из 5 разных таблиц, которые будут использоваться в комбинациях в качестве параметров, таких как;Динамические, семантические URL-маршруты

helloworld.com/universe 
helloworld.com/universe/earth 
helloworld.com/universe/earth/australia 
helloworld.com/universe/earth/australia/melbourne 
helloworld.com/universe/earth/australia/melbourne/city 

Где я тяну ряды из таблиц мира, мира, страны, города и региона. Таким образом, существует маршрут, написанный для каждого helloworld.com/(universe) и helloworld.com/universe1/(planet) и так далее.

Как наша база данных в настоящее время, она генерирует 85000 страниц в качестве маршрутов в нашем файле routes.php. Я ожидаю, что это вырастет в миллионы в течение следующих нескольких месяцев.

Он работает отлично, как на данный момент, но является ли этот метод устойчивым? Будет ли это влиять на производительность при загрузке страницы, если ее маршрутизация использует файл с миллионами маршрутов в нем?

+0

Зависит от того, сколько памяти у вас есть в вашей базе данных, и если ваши таблицы правильно проиндексированы. Индексирование очень важно, когда у вас тысячи или миллионы строк. – Devon

+0

Это не база данных, которая увидит миллионы строк. На данный момент это должно оставаться относительно небольшим. Это комбинация строк, которые будут записаны в виде маршрутов в нашем файле маршрутов codeigniter, о котором я беспокоюсь. – pjmil

+0

А, я не знаю много о codeigniter или о том, как работает маршрутизатор, поэтому я оставлю это для кого-то еще. – Devon

ответ

2

Предполагая, что существуют только эти уровни маршрутов, вы можете существенно сократить количество линий в ваших маршрутах. Вот как:

добавить их в вашем routes.php

$route['universe/(.*)/(.*)/(.*)/(.*)'] = 'controller/function/$1/$2/$3/$4'; 
$route['universe/(.*)/(.*)/(.*)'] = 'controller/function/$1/$2/$3'; 
$route['universe/(.*)/(.*)/'] = 'controller/function/$1/$2'; 
$route['universe/(.*)'] = 'controller/function/$1'; 

Объект, который вы видите, RegEx это означает, что "ничего" (. *).

Для URL-адрес helloworld.com/universe/earth/australia/melbourne/city, маршрут будет рассматривать $route['universe/(.*)/(.*)/(.*)/(.*)'] и направит вас, чтобы controller/function/$1/$2/$3/$4 где $ 1, $ 2, $ 3 и $ 4 будет параметры функции в контроллере ,

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

Убедитесь, что маршрут находится в этом порядке, поскольку CodeIgniter предполагает, что самый верхний приоритет - самый высокий.

+0

Проблема в том, что разделение 'universe' в url также может быть чем угодно, и мы уже используем' $ route ['(. *)'] 'Для чего-то другого. Я забыл упомянуть об этом, извините. – pjmil

+0

Я не думаю, что это имело бы значение. Просто добавьте '$ route [(. *)/(. *)/(. *)/(. *)/(. *) /]' В верхней части маршрута. И подобная логика должна помочь. – vnay92

+0

'$ route [(. *)]' Будет использоваться для функций в двух разных контроллерах. Это не сработает. – pjmil