Маршрутизация CodeIgniter

Я разрабатываю веб-сайт электронной коммерции с CI, который имеет категории продуктов и продукты. Я хочу направить URL-адрес так, чтобы он попадал в контроллер продуктов, затем запустить функцию getCategoryByName для первого сегмента, а затем запустить функцию getProductByName для второго сегмента. Вот что у меня есть:

URL:
products/docupen/rc805
routes.php:
$route['products/([a-z]+)'] = "products/getCategoryByName/$1";
$route['products/([a-z]+)/([a-z0-9]+)'] = "products/$1/getProductByName/$2";

Но это не работает. «docupen» — это категория, а «rc805» — это продукт.

Заранее спасибо.


Спасибо за вашу помощь. Это то, что я закончил с тем, что мне нужно.

$route['products/:any/:num'] = "products/getProductByID";
$route['products/:any/:any'] = "products/getProductByName";
$route['products/:any'] = "products/getCategoryByName";

person Torez    schedule 17.08.2009    source источник


Ответы (3)


Мой ответ немного основывается на ответе Колина.

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

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

$route['default_controller'] = "main";
$route['main/:any'] = "main";
$route['events/:any'] = "main/events";
$route['search/:any'] = "main/search";
$route['events'] = "main/events";
$route['search'] = "main/search";
$route[':any'] = "main";

Если бы я ввел "http://localhost/index.php/search/1234/4321" Он будет перенаправлен в main/search, и затем я смогу использовать $this->uri->segment(2); для получения файла 1234.

В вашем сценарии я бы попробовал (порядок очень важен):

$route['products/:any/:any'] = "products/getProductByName";
$route['products/:any'] = "products/getCategoryByName";

Я недостаточно знаю, чтобы маршрутизировать так, как вы хотели (products/$1/getProductByName/$2), но я не уверен, как бы вы создали контроллер для обработки этой конкретной формы URI. Используя операторы $this->uri->segment(n);, упомянутые Колином в вашем контроллере, вы сможете делать то, что хотите.

person Stephen Perelson    schedule 19.08.2009

Вы должны использовать класс URI для извлечения сегментов "docupen" и "rc805" из вашего URL. Затем вы можете использовать эти значения в любых функциях, которые вам нужны.

Например, если ваш URL-адрес — www.yoursite.com/products/docupen/rc805, вы должны использовать следующее в своем контроллере продуктов, чтобы получить сегменты и назначить их переменным:

$category = $this->uri->segment(2); //docupen
$product = $this->uri->segment(3); //rc805

Затем вы можете использовать $category и $product, как вам нужно.

person Colin Brock    schedule 17.08.2009

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

$route['products/(:any)'] = "products/getCategoryByName/$1";
$route['products/(:any)/(:any)'] = "products/$1/getProductByName/$2";
person Zack    schedule 18.08.2009