Вложенные маршруты Cakephp

#php #cakephp

#php #cakephp

Вопрос:

У меня есть контроллер под названием Items, а другой называется Categories. Элементы могут принадлежать к разным категориям.

Маршруты, которые у меня есть, являются

 /items
/items/:item_id
/items/categories
/items/categories/:category_id
  

И это мой routes.php

 Router::connect('/items', array('controller' => 'items', 'action' => 'index');
Router::connect('/items/:item_id', array('controller' => 'items', 'action' => 'view'), array('pass' => array('item_id')), array("item_id" => "[0-9] "));
Router::connect('/items/categories', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/items/categories/:category_id', array('controller' => 'categories', 'action' => 'view', array('pass' => array('category_id')), array("category_id" => "[0-9] "));
  

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

Как я могу исправить эту проблему?

Ответ №1:

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

 Router::connect('/items', array('controller' => 'items', 'action' => 'index');
Router::connect('/items/categories', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/items/categories/:category_id', array('controller' => 'categories', 'action' => 'view', array('pass' => array('category_id')), array("category_id" => "[0-9] "));
Router::connect('/items/:item_id', array('controller' => 'items', 'action' => 'view'), array('pass' => array('item_id')), array("item_id" => "[0-9] "));
  

удачи

Комментарии:

1. обычно вы хотите перечислить их от lest gready (наиболее точного) до most gready (например, /* [a catch all] почти никогда не будет первым маршрутом, но имеет место как последний)

Ответ №2:

в вас config/routes.php

поместите строку

 Router::connect('/items/categories', array('controller' => 'categories',
 'action' => 'index'));
  

или что-то подобное.

это перенаправит всех вас / элементы / категории в действие индексации контроллера категорий.

для страниц администратора (действия, использующие префикс admin):

 Router::connect('/items/categories', array('controller' => 'categories',
 'action' => 'index','admin'=>true));
  

Комментарии:

1. Спасибо. На самом деле это то, что у меня там есть, но оно по-прежнему вызывает действие просмотра элементов. Теперь я добавлю маршруты в вопрос.

2. Просто для наглядности. это публичные действия или действия администратора?

3. Что ж, пользователи входят в систему и видят свои элементы и категории.

4. если это страницы администратора (с использованием маршрутизации администратора), вы можете указать ‘admin’ => true в ваших маршрутах. Я добавил это в свой пост.

5. Спасибо, чувак. Похоже, проблема заключалась в порядке следования маршрутов.