Как маршрутизировать маршруты codeigniter для доступа к пользователям, как в Facebook (www.facebook.com/username)

Я использую фреймворк codeigniter и по умолчанию загружаю свой контроллер сайта.

$route['default_controller'] = "site";

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

Это что-то вроде Facebook, где у вас есть www.facebook.com/username, и вы попадаете в свой профиль пользователя. Но я бы хотел, чтобы другие мои контроллеры по-прежнему были доступны www.mysite.com/site, www.mysite.com/site/function и т. д.

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


person BoonZ    schedule 02.04.2013    source источник
comment
Тогда ваш URL-адрес по умолчанию будет domain/site/userid просто использовать шаблон соответствия и сопоставить маршрут domain/userid с domain/site/userid. Таким образом, вы можете позвонить domain/1, и в фоновом режиме CI вызовет сайт controller > show с этим идентификатором.   -  person Sterling Duchess    schedule 02.04.2013


Ответы (2)


Попробуйте мой способ:

Во-первых, установите $route для каждого контроллера, который у вас есть, exmp:

$route['controller_1'] = 'controller_1';
$route['controller_1/(:any)'] = 'controller_1/$1'; //this let you access your method
$route['controller_2'] = 'controller_2';
$route['controller_2/(:any)'] = 'controller_2/$1'; //this let you access your method

Далее используйте :any

$route['(:any)'] = 'user_controller/$1';

удачи !!!

person egig    schedule 02.04.2013
comment
Хм... концепция хороша, но она не позволяет мне получить доступ к контроллеру_1/метод_1, он обращается только к контроллерам, которые являются контроллером_1 или контроллером_2 без методов, но у меня есть много методов в этих контроллерах. Так есть ли другое решение? - person BoonZ; 02.04.2013
comment
только что отредактировал свой ответ, теперь вы можете получить доступ к «controller_1/method_1». - person egig; 02.04.2013
comment
Да, это решает мою проблему, но иногда у меня также есть идентификатор в URL-адресе, например controller_1/method_1/id, будет ли ваше обновление работать с этим или мне придется добавить $route['controller_1/(:any)/(:any)'] = ' контроллер_1/$1/$2'; ? - person BoonZ; 02.04.2013
comment
Нет, не надо, моего ответа достаточно. Я проверил это на своем, и вы также можете проверить его на своем. - person egig; 02.04.2013

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

//this code block should be placed after any kind of reserved routes config
$url_parts = explode('/',strtolower( $_SERVER['REQUEST_URI']) );
$reserved_routes = array("controller_1", "controller_2", "controller_3" );
if (!in_array($url_parts[1], $reserved_routes)) {    
    $route['([a-zA-Z0-9_-]+)'] = "controller_1/profile/$1";
}
person Atikul Islam    schedule 21.08.2013