Маршруты в Codeigniter - автоматически - PullRequest
7 голосов
/ 01 октября 2011

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

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

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

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

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

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

UPDATE: Например, у меня есть контроллер с именем 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'] = '';

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

Ответы [ 4 ]

26 голосов
/ 01 октября 2011

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

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

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

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

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

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

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

/ end edit

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

ИЛИ

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

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

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

2 голосов
/ 20 марта 2013

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

1 голос
/ 08 января 2017

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

$controllers=array('admin', 'user', 'blog', 'api');
if(array_search($this->uri->segment(1), $controllers)){
    $route['.*'] = "polica/ogled/$1";
}
1 голос
/ 01 октября 2011

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

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

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

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

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

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

то есть

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

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

...