Маршрутизация в CodeIgniter для (:any)

Я пытаюсь заставить свое приложение CodeIgniter работать аналогично WordPress.

Я хочу иметь возможность создавать такие URL-адреса:

http://www.example.com/my-post-example

http://www.example.com/new-headline-here

http://www.example.com/i-love-stackoverflow

Моя маршрутизация:

$route['(:any)'] = "core/index/$1";

Который вызовет мой основной контроллер и передаст имя страницы в функцию индекса.

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

Однако будут случаи, когда я захочу вызвать другой контроллер. Например:

http://www.example.com/admin/edit_page/3

http://www.example.com/admin/settings

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

Например,

if ($page not in DB) {
   // Call controller/method
}

Это кажется немного избыточным, так как я просто хочу, чтобы CodeIgniter справился с этим.


person Oliwol    schedule 11.05.2017    source источник


Ответы (1)


Правило маршрутизации, которое вы используете, подходит для вашей цели.

Если вы используете http://www.example.com/admin/edit_page/3 эту ссылку, она отправит вам admin контроллер и edit_page метод. Он не будет использовать any правило маршрутов.

Однако у вас возникнет одна проблема, если ваша ссылка будет выглядеть так:

http://www.example.com/my-post-example/test

Он попытается пройти my-post-example контроллер и метод тестирования.

Опять же, http://www.example.com/admin будет использовать правило маршрутов any, что означает, что он будет перенаправлять ваш основной контроллер вместо admin/index. В этом случае ваш URL должен быть http://www.example.com/admin/index

Наконец Если вы вызовете другую ссылку с именем контроллера/метода, все будет в порядке, используя ваше правило any

person Shaiful Islam    schedule 11.05.2017
comment
Спасибо! Есть ли способ сопоставить любой шаблон URL? В том числе с /? Значит, admin/edit/lol/ тоже пойдет в core/index? Или мне нужно будет постоянно добавлять (:any)/(:any)/(:any)? - person Oliwol; 11.05.2017
comment
добавьте еще одно правило перед вашим $route['(:any)'] = "core/index/$1";rule $route['admin/edit/lol'] = "core/index"; - person Shaiful Islam; 11.05.2017
comment
Что, если я хочу направить любые данные в функцию, например: admin/edit/lol => core/index, а также admin/new/test => core/index. Есть ли лучший способ, чем добавление каждого отдельного правила? Как и route['admin/(:any)/(:any)'] - но с возможностью добавления 3-го, 4-го и 5-го до бесконечности. - person Oliwol; 21.05.2017
comment
Да, вы можете написать столько правил, сколько хотите. Но вы должны поддерживать порядок. И вы можете оптимизировать код, написав одно правило для подобных правил. - person Shaiful Islam; 22.05.2017