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

Я использую PagesController (не тот, который встроен в Cake), и я хотел бы подключить новый маршрут:

Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

Я действительно хочу, чтобы Cake использовался ТОЛЬКО в случае сбоя всех остальных (по умолчанию) маршрутов. Однако я не могу заставить его работать только с маршрутами. У меня есть подозрение, что мне нужно будет использовать собственный класс CakeRoute, но я абсолютно не знаю, как заставить его делать то, что я хочу.

Может ли кто-нибудь помочь мне с этим?

[править] О, и было бы полезно узнать, что я использую CakePHP 2.2.0

[2-е изменение] По запросу, еще немного информации. Мой роутер сейчас выглядит так:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

И когда я захожу в / home / about, я получаю «Ошибка: не удалось найти HomeController». Я тоже пробовал это:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
CakePlugin::routes();
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));
require CAKE . 'Config' . DS . 'routes.php';

Но затем ВСЕ направляется на мой контроллер страниц, а я этого не хочу. Я хочу, чтобы этот маршрут использовался только в случае сбоя всех остальных маршрутов.

Опять же, у меня есть подозрение, что это можно сделать только с помощью специального класса CakeRoute, но я не знаю, как именно.


person Evert    schedule 12.07.2012    source источник
comment
хммм просто проверить ... это ПОСЛЕДНИЙ маршрут в файле routes.php ?? порядок очень важен   -  person pleasedontbelong    schedule 13.07.2012
comment
Да, я тоже пробовал, но потом он вообще никогда не используется. Если другой маршрут не может найти соответствующий контроллер / действие, он просто выдает мне страницу с ошибкой вместо того, чтобы пытаться использовать мой запасной маршрут.   -  person Evert    schedule 13.07.2012
comment
не могли бы вы опубликовать свой routes.php и пример неудачного URL-адреса?   -  person pleasedontbelong    schedule 13.07.2012
comment
Я поместил дополнительную информацию в начальный пост.   -  person Evert    schedule 13.07.2012


Ответы (2)


попробуйте поставить общий маршрут в конце, но перед строкой CakePlugin::routes();. Что-то вроде этого:

Router::connect('/', array('controller' => 'pages', 'action' => 'index'));
//all your routes
Router::connect('/*', array('controller' => 'pages', 'action' => 'view'));

CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';

надеюсь это поможет

EDITED: у меня есть веб-сайт с тем же принципом .. и я использовал этот маршрут

Router::connect('/:slug', array('controller' => 'users', 'action' => 'view'),array('pass'=>array('slug'),'slug'=>"[a-z0-9\-]+"));

в конце (до CakePlugin::routes()) и у меня все работает нормально.

person pleasedontbelong    schedule 13.07.2012
comment
Я уже пробовал это, но затем все перенаправляется на мои страницы / представление, в то время как мне нужны только URL-адреса, которые не могут маршрутизироваться, для маршрутизации на мои страницы / представление - person Evert; 13.07.2012
comment
возможно, проблема в том, что _1 _... вы пытались передать переменную? я отредактировал свой ответ примером одного из моих сайтов - person pleasedontbelong; 14.07.2012
comment
Для меня это работает только с URL-адресами, в которых есть только одно слово. Когда я делаю / home, это работает, но когда я пытаюсь получить подстраницу, например / home / about, она больше не работает. - person Evert; 14.07.2012
comment
хмм, возможно, добавив /** маршрут после того, который я вам дал, проверьте этот book.cakephp.org/2.0/en/development/ - person pleasedontbelong; 14.07.2012
comment
Затем у меня возникает та же проблема, что и раньше, маршрут используется для каждого URL-адреса, а не только для URL-адресов, которые не могут маршрутизироваться, что я действительно хочу. - person Evert; 14.07.2012

Я знаю, что это старый пост, но для тех, кто борется с всеобъемлющей маршрутизацией в Cake, вот что:

Когда вы создаете маршрут для приема всей почты домена, такой как / *, вы позволяете этому определению захватывать все и вся в URL-адресе. Другими словами, это очень жадно. Насколько я могу судить, нет возможности включить такое определение условно. Это означает, что если URL-адрес не соответствует какому-либо определению маршрута до определения / *, то определение / * подберет его. Поэтому всегда определяйте комплексные маршруты последними, о чем мы, конечно же, уже знаем :-)

Теперь, чтобы гарантировать, что Cake продолжает работать «нормально» - это означает, что URL-адрес, такой как / posts / view / 4, будет перенаправлен на PostsController :: view ($ id = 4) - вам действительно нужно явно определить его в routes файл перед определением / *. Да, если вы используете маршруты для приема всей почты домена в Cake, вам необходимо явно определить каждый маршрут Controller :: method () перед ним, чтобы использовать стандартные соглашения о маршрутизации Cake.

Хотя это может показаться пугающим, это не так уж плохо, если вы разместите все определения маршрутов в routes.php по алфавиту. Просто посмотрите на каталог вашего проекта / Controller и перечислите их в том же порядке. Я также реализую комментарий над каждой группой контроллеров, поскольку для некоторых требуется более одного определения маршрута. Вот пример, извлеченный из одного из моих файлов routes.php:

/**
 * CaseStudiesController
 */
Router::connect('/case-studies', array('controller' => 'case_studies', 'action' => 'index'));
Router::connect('/case-studies/:action', array('controller' => 'case_studies'));
Router::connect('/case-studies/:action/*', array('controller' => 'case_studies'));
Router::connect('/case-studies/*', array('controller' => 'case_studies', 'action' => 'index'));

/**
 * PostsController
 */
Router::connect('/posts', array('controller' => 'posts', 'action' => 'index'));
Router::connect('/posts/:action', array('controller' => 'posts'));
Router::connect('/posts/:action/*', array('controller' => 'posts'));
Router::connect('/posts/*', array('controller' => 'posts', 'action' => 'index'));

Вообще говоря, вам понадобится всего 4 определения маршрута для каждого контроллера. И, наконец, в моем случае нижняя часть routes.php:

/**
 * UrlAliasesController
 *
 * This catch-all route is very greedy and even grabs the default CakePHP /:controller/:action URL format
 * Above this line, all public controller methods must be accounted for in specific routes
 */
Router::connect('/*', array('controller' => 'url_aliases', 'action' => 'check', 'admin' => false));

/**
 * Load all plugin routes. See the CakePlugin documentation on
 * how to customize the loading of plugin routes.
 */
CakePlugin::routes();

/**
 * Load the CakePHP default routes. Only remove this if you do not want to use
 * the built-in default routes.
 */
require CAKE . 'Config' . DS . 'routes.php';
person etipaced    schedule 04.06.2015