Маршруты в Codeigniter - Автоматически


У меня проблема с маршрутами Codeigniter. Я бы хотел, чтобы все зарегистрированные пользователи на моем сайте получили свой собственный "каталог", например: www.example.com/username1, www.example.com/username2. Этот "каталог" должен соответствовать контроллеру "polica", методу "ogled", параметру "username1".

Если мне это нравится, то каждый контроллер сопоставляется с этим маршрутом: "polica/ogled/параметр". Это не нормально:

$route["(:any)"] = "polica/ogled/$1";

Это работает, но я всегда вручную вводил информацию в routes.php:

$route["username1"] = "polica/ogled/username1";

Как мне сделать так, чтобы это будет ли автоматизировано?

ОБНОВЛЕНИЕ: Например, у меня есть контроллер с именем ads. Например, если вы перейдете на www.example.com/ads/ , там будут перечислены объявления. Если вы перейдете на www.example.com/username1, там будут перечислены объявления пользователя username1. Есть также контроллер user, profile, latest,...

Мой текущий routes.php:

$route['oglasi'] = 'oglasi';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

Я решил проблему с помощью этого кода:

$route['oglasi/(:any)'] = 'oglasi/$1';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

С уважением, Марио

Author: Puzo, 2011-10-01

4 answers

Проблема с вашим маршрутом заключается в том, что при использовании: на самом деле вы соответствуете любому...ЛЮБОЙ маршрут, так что вы в значительной степени застряли там. Я думаю, у вас может быть два решения:

1) Вы можете выборочно перенаправлять все ваши контроллеры сайтов по отдельности, например:

$route['aboutus'] = "aboutus";
$route['where-we-are'] = "whereweare";
//And do this for all your site's controllers
//Finally:
$route['(:any)'] = "polica/ogled/$1";

Все эти маршруты должны предшествовать ЛЮБОМУ, так как они читаются в том порядке, в котором они представлены, и если вы поместите:любой в начале, он с радостью пропустит все остальное.

РЕДАКТИРОВАТЬ после комментарий:

Я имею в виду, что если вы собираетесь сопоставлять КАКОЙ-ЛИБО сегмент, это означает, что вы вообще не можете использовать какой-либо контроллер (который по умолчанию является первым сегментом URI), так как маршрутизатор всегда будет перенаправлять вас, используя ваш определенный закон. Чтобы разрешить CI выполнять другие контроллеры (какими бы они ни были, я просто использовал некоторые общие веб-страницы, но может быть буквально все), вам нужно разрешить им, исключив их из повторной маршрутизации. И вы можете добиться этого, разместив их перед ЛЮБЫМ вашим правилом, так что каждый раз, когда CI проходит через ваши правила маршрутизации, он сначала анализирует тот, который вы "сбежали", и ТОЛЬКО если они не соответствуют ничему, что он нашел в URL, он переходит к: ЛЮБОМУ правилу.

Я знаю, что, тем не менее, это многословие кода, но они наверняка будут меньше 6 тысяч, как вы сказали. Поскольку я не знаю фактической структуры ваших URL-адресов и вашего веб-приложения, это единственное решение, которое приходит мне на ум. Если вы предоставите дополнительную информацию, например, как сформируйте обычные URL-адреса вашего приложения, тогда я смогу обновить свой ответ

/ завершить редактирование

Это не очень практичное решение, потому что для этого потребуется много кода, но если вам нужен такой дизайн, это единственный способ, который приходит мне на ум. Кроме того, подумайте, что вы можете использовать регулярные выражения в качестве индекса $route, но я не думаю, что это может сработать здесь, так как ваши имена пользователей вряд ли совпадают таким образом, но я просто хотел указать на возможность.

ИЛИ

2) Вы можете немного изменить свой шаблон проектирования и назначить другой маршрут именам пользователей, что-то вроде

$route['user/(:any)'] = "polica/ogled/$1";

Тем не менее, это создаст довольно красивые (и семантические) URL-адреса и позволит избежать всех проблем, связанных с выходом из других маршрутов.

 25
Author: Damien Pirsy, 2011-10-01 09:35:30

Просмотрите это: http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php / который включает в себя удаление index.php/удаление 1-го сегмента URL-адреса/автоматическое удаление 2-го сегмента URL-адреса/маршрутизации.это будет очень полезно для вас.

 2
Author: jiabo.zhang, 2013-03-20 10:17:45

Совсем недавно я боролся с этой же проблемой. Я создал нечто, что работало для меня таким образом:

Определите контроллер "перенаправления" с помощью метода переназначения . Это позволит вам собрать запросы, отправленные в contoller с любой текущей переменной строкой, в одну функцию. Поэтому, если запрос сделан на http://yoursite/jeff/ или http://yoursite/jamie, он не попадет в эти методы, а вместо этого попадет в функцию переназначения http://yoursite/. (даже если эти методы/имена не существуют и даже если у вас есть функция индекса, он заменяет его). В методе _Remap вы можете определить условный переключатель, который затем будет работать с остальной частью вашего кода, перенаправляя пользователя так, как вы хотите.

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

$route['(.*)'] = "redirect/index/$1";
$route['default_controller'] = "redirect";

Поначалу это небольшая проблема, потому что это в основном заставит все перенаправляться на этот контроллер, несмотря ни на что, и в конечном итоге через этот переключатель _remap.

Но что вы могли бы сделайте это, определите правила/маршруты, которые вы не хотите соблюдать в соответствии с этим условием, выше этих инструкций маршрута.

Т.е.

$route['myroute'] = "myroute";
$route['(.*)'] = "redirect/index/$1";
$route['default_controller'] = "redirect";

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

 1
Author: Chamilyan, 2011-10-01 07:40:02

Другим способом было бы объявить массив с вашими внутренними контроллерами и перенаправить все остальное на пользовательский контроллер, как это в вашем routes.php файл из codeigniter:

$controllers=array('admin', 'user', 'blog', 'api');
if(array_search($this->uri->segment(1), $controllers)){
    $route['.*'] = "polica/ogled/$1";
}
 1
Author: alex iancu, 2017-01-08 06:31:44