Нет ничего особенного в маршрутах, которые вы пытаетесь построить. Без описания точно того, как нарушаются ваши маршруты / отправки, трудно определить какие-либо эзотерические способы маршрутизации, с которыми вы могли бы столкнуться (и поверьте мне, они есть).
Прежде чем перейти к деталям, я настоятельно рекомендую всегда использовать обратную маршрутизацию для создания своих URL-адресов (т. Е. $html->url(array('controller'=>'homes','action'=>'index'));
вместо $html->url('/homes/index')
. Это небольшой удар по производительности, который в конечном итоге избавит вас от некоторых серьезных головных болей.
Давайте пробежимся по вашим примерным маршрутам, и я попытаюсь объяснить, как создать соответствующий URL в ваших представлениях, и выделить потенциальные проблемы, с которыми вы столкнулись.
Router::connect('/:filter/h/:id', array('controller'=>'homes','action'=>'view'));
Вы бы создали URL в своем представлении со следующим обратным маршрутом:
$html->url( array(
'controller'=>'homes','action'=>'view',
'id'=>$some_id,'filter'=>$some_filter
));
Обратите внимание, что я передал ключи 'id'
и 'filter'
вместо того, чтобы просто передавать соответствующие переменные. Это связано с тем, что Cake обрабатывает параметры обратного маршрута без ключей по порядку. Так что если вы позвонили:
$some_filter = 'foobar';
$some_id = 1234;
$html->url( array('controller'=>'homes','action'=>'view',$some_id,$some_filter));
Вы получите этот URL:
/1234/h/foobar
Что в обратном направлении.
Другая проблема, с которой вы можете столкнуться, заключается в том, как этот маршрут передается действию контроллера. По умолчанию Cake передает все параметры запроса маршрута в том порядке, в котором они указаны в определении маршрута, если не указано иное. Итак, с маршрутом выше, Cake будет звонить:
HomesController::view( $filter, $id );
Если вы хотите, чтобы первый параметр HomesController::view
был $id
, вам нужно будет указать его в определении маршрута:
// This route definition...
Router::connect(
'/:filter/h/:id',
array( 'controller'=>'homes', 'action'=>'view' ),
array(
'pass' => array( 'id', 'filter' )
)
);
// ...invokes the controller action:
// HomesController::view( $id, $filter );
Элемент 'pass'
третьего параметра массива для Router::connect
сообщает Cake, какие параметры маршрута и в каком порядке следует передать действию контроллера. Вы можете удалить 'filter'
из массива, и Cake вызовет действие следующим образом:
HomesController::view( $id );
В этом случае Cake по-прежнему захватывает $filter
и делает его доступным для контроллера как элемент свойства Controller::params
. Вы можете получить доступ к его значению, обратившись к $this->params['filter']
.
Второй предоставленный вами маршрут:
Router::connect('/admin/:controller/:action/:id');
Для административной маршрутизации вам не нужно определять конкретные маршруты, которым предшествует 'admin'
. Вам нужно только включить admin routing . В вашем /app/config/core.php
найдите и раскомментируйте строку:
Configure::write('Routing.admin', 'admin');
Это позволяет вам определять набор действий с префиксом admin_
(например, admin_edit
, admin_publish
и т. Д.), Которые отправляются по URL-адресу, например /admin/homes/edit/1234
. По вашему мнению, вы должны структурировать обратные маршруты следующим образом:
$html->url( array(
'controller'=>'homes','action'=>'edit',1234
'admin'=>true
));
Обратите внимание на часть 'admin'=>true
, которая сообщает Cake, что вы запрашиваете маршрут с префиксом администратора.