Настройка маршрутизации CakePHP 2.0 для домена / параметра (без имени контроллера)

#cakephp #routes #cakephp-2.0

#cakephp #маршруты #cakephp-2.0

Вопрос:

Я хотел бы иметь возможность маршрутизировать что-то вроде следующего в CakePHP 2.0:

 domain.com/london
domain.com/milton keynes
 

к определенному контроллеру и действию.

Приложение имеет несколько контроллеров, поэтому оно должно использовать этот маршрут только в том случае, если предоставленный параметр не соответствует имени контроллера. Я добился этого с помощью CakePHP 1.3.12, добавив следующий код в конец config/routes.php

 Router::connect(
  '/:location',
  array('controller' => 'articles', 'action' => 'testing'),
  array('pass' => array('location'), 'location' => '[a-z ] ')
);
 

Использование этого кода с CakePHP 2.0 работает только в том случае, если я закомментирую require строку из config/routes.php , но затем я теряю маршруты по умолчанию, так что URL, указывающий на любой другой контроллер, перехватывается этим.

Как я могу добиться желаемой маршрутизации?

Ответ №1:

Насколько я знаю, это также не должно работать в Cake 1.3, просто потому, что ваше [a-z ] регулярное выражение также соответствует случаю для простого маршрута / controller_name; Маршрутизатор не может различать два и, таким образом, всегда будет перенаправлять на тот, с которым он сталкивается первым.

Однако вы можете создать пользовательский класс маршрута для достижения этой цели. Марк Стори (один из разработчиков Cake) написал об этом отличный пост некоторое время назад, он для Cake 1.3, но вы можете легко применить этот принцип к 2.0 (я знаю, потому что я использую его в своем приложении 2.0). Вы можете найти сообщение здесь.

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

1. Спасибо — да пользовательский класс маршрута, который просматривает предоставленный URL-адрес, запрашивает базу данных, чтобы узнать, существует ли он там, если он существует — отправить на контроллер

Ответ №2:

Это может не отвечать на конкретный вопрос, заданный выше, но это актуально, эта страница появляется в результатах поиска, и моя цель — сэкономить время тому, кто его найдет (включая, я думаю, будущего меня), чтобы не исследовать то, что я только что исследовал.

Мне нужно было добавить маршрутизацию с параметром для другого домена. Например, example.com должен вести себя как обычно, в то время example.org/some_page как должен перенаправляться непосредственно к определенному контроллеру и действию. Итак, я добавил следующее в свой Config/routes.php :

 if ( CakeRequest::host()=='example.org' ) {
    Router::connect('/:my_variable', 
        array(
            'controller'=>'my_controller', 
            'action'=>'my_action'
        ),
        array(
            'my_variable'=>'[a-zA-Z-0-9 ] ', 
            'pass'=>array('my_variable')
        )
    );
}