Маршруты CakePHP: возиться с MVC - PullRequest
0 голосов
/ 24 апреля 2010

Итак, у нас есть сайт, связанный с недвижимостью, у которого есть пары контроллер / действие, такие как «дома / вид», «риэлторы / редактирование» и так далее. С самого начала было признано хорошей идеей реорганизовать сайт таким образом, чтобы URL-адреса теперь были в формате "/ realtorname / homes / view / id" и, возможно, также "/ admin / homes / view / id" и / или " /region/..."

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

Router::connect('/:filter/h/:id', array('controller'=>'homes','action'=>'view'));
Router::connect('/admin/:controller/:action/:id');

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

  • Является ли глупой идеей играть быстро и свободно с форматом / controller / action таким образом?
  • Есть ли лучший способ указать эти маршруты, чтобы все не нарушалось вопиющим образом?
  • Было бы лучше вернуться к поддоменам (первоначальный метод достижения такого типа функциональности, сбитый на потенциально ложных основаниях, связанных с SEO)?

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

1 Ответ

2 голосов
/ 24 апреля 2010

Нет ничего особенного в маршрутах, которые вы пытаетесь построить. Без описания точно того, как нарушаются ваши маршруты / отправки, трудно определить какие-либо эзотерические способы маршрутизации, с которыми вы могли бы столкнуться (и поверьте мне, они есть).

Прежде чем перейти к деталям, я настоятельно рекомендую всегда использовать обратную маршрутизацию для создания своих 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, что вы запрашиваете маршрут с префиксом администратора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...