У меня проблема с маршрутами Codeigniter. Я бы хотел, чтобы все зарегистрированные пользователи на моем сайте получили свой собственный «каталог», например: www.example.com/username1
, www.example.com/username2
. Этот «каталог» должен отображаться на контроллер «polica», метод «ogled», параметр «username1».
Если мне это нравится, то каждый контроллер сопоставляется с этим маршрутом: «polica / ogled / parameter». Это не хорошо:
$route["(:any)"] = "polica/ogled/$1";
Это работает, но я всегда вручную routes.php
информацию в 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'] = '';
С уважением, Марио
Проблема с вашим маршрутом заключается в том, что, используя: любой, который вы соответствуете, на самом деле … ЛЮБОЙ маршрут, так что вы в значительной степени застряли там. Я думаю, у вас могут быть два решения:
1) Вы можете выборочно перенаправлять все контроллеры своих сайтов по отдельности, например:
$route['aboutus'] = "aboutus"; $route['where-we-are'] = "whereweare"; //And do this for all your site's controllers //Finally: $route['(:any)'] = "polica/ogled/$1";
Все эти маршруты должны прибыть ПЕРЕД ЛЮБОЙ, поскольку они читаются в том порядке, в котором они представлены, и если вы поместите: любой в начале, он с радостью пропустит все остальное.
EDIT после комментария:
Я имею в виду, что если вы собираетесь соответствовать любому сегменту, это означает, что вы не можете использовать какой-либо контроллер вообще (по умолчанию это первый сегмент URI), поскольку маршрутизатор всегда будет перенаправлять вас с помощью вашего определенного закона. Чтобы позволить CI выполнять другие контроллеры (независимо от того, что они есть, я просто использовал некоторые общие веб-страницы, но может быть буквально все), вам нужно разрешить их, исключив их из повторной маршрутизации. И вы можете достичь этого, поставив их перед своим ЛЮБЫМ правилом, чтобы каждый раз, когда CI проходил через ваши правила маршрутизации, он сначала анализирует тот, который вы «избежали», и ТОЛЬКО, если они не соответствуют чему-либо, найденному в URL-адресе, он передает к правилу ЛЮБОГО.
Я знаю, что это многословность, тем не менее, но они наверняка будут меньше 6K, как вы сказали. Поскольку я не знаю фактической структуры ваших URL-адресов и вашего веб-приложения, это единственное решение, которое приходит мне на ум. Если вы предоставите дополнительную информацию, например, как формируются обычные URL-адреса вашего приложения, то я могу обновить свой ответ
/ end редактировать
Это не очень рациональное решение, потому что для этого потребуется много кода, но если вы хотите создать такой дизайн, это единственный способ, который приходит мне на ум. Также подумайте, что вы можете использовать регулярные выражения в качестве индекса маршрута $ route, но я не думаю, что он может работать здесь, так как ваши имена пользователей вряд ли подходят для этого способом, но я просто хотел указать на возможность.
ИЛИ
2) Вы можете слегка изменить свой шаблон дизайна и назначить другой маршрут для имен пользователей, что-то вроде линии
$route['user/(:any)'] = "polica/ogled/$1";
Тем не менее это создаст довольно симпатичные (и семантические) URL-адреса, и это позволит избежать всех неприятностей с тем, чтобы избежать других маршрутов.
просмотрите это: http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php/, который включает удаление index.php / remove 1-го сегмента URL-адреса / удаление 2-го URL-адреса / маршрутизации автоматически .it будет очень полезен для вас.
Я очень недавно боролся с этой проблемой. Я создал что-то, что сработало для меня таким образом:
Определите контроллер перенаправления с помощью метода переназначения . Это позволит вам собирать запросы, отправленные контоллеру, с любой строкой переменной процесса в одну функцию. Поэтому, если запрос сделан на http://yoursite/jeff/
или http://yoursite/jamie
он не ударит по этим методам, а вместо этого ударит http://yoursite/
remap. (даже если эти методы / имена не существуют и даже если у вас есть индексная функция, она заменяет его). В методе _Remap вы можете определить условный переключатель, который затем будет работать с остальной частью вашего кода, перенаправляя пользователя любым способом.
Затем вы должны определить этот контроллер перенаправления как стандартный по умолчанию и настроить свои маршруты следующим образом:
$route['(.*)'] = "redirect/index/$1"; $route['default_controller'] = "redirect";
Это вначале проблема, потому что это в основном вынудит все перенаправить на этот контроллер независимо от того, что и в конечном итоге с помощью этого переключателя _remap
.
Но что вы можете сделать, это определить правила / маршруты, которые вы не хотите соблюдать этому условию над этими инструкциями маршрута.
т.е.
$route['myroute'] = "myroute"; $route['(.*)'] = "redirect/index/$1"; $route['default_controller'] = "redirect";
Я обнаружил, что это создает отличную систему, в которой я могу иметь столько переменных пользователей, сколько определено, где я могу легко перенаправить их на основе того, что они поддерживают через один контроллер.
Другой способ – объявить массив с вашими контроллерами intenal и перенаправить все остальное на пользовательский контроллер, как это, в файл routes.php от codeigniter:
$controllers=array('admin', 'user', 'blog', 'api'); if(array_search($this->uri->segment(1), $controllers)){ $route['.*'] = "polica/ogled/$1"; }