I need to create routes that include a colon to produce URLs like http://app.com/prjct:a9b5c
. Obviously it's currently simple to use a slash instead with the default routing.
$SLUG = array('slug' => '[-_A-Za-z0-9]+');
Router::connect('/prjct/:slug', array('controller' => 'projects', 'action' => 'show'), $SLUG);
But routes specifications use the colon character as a special indicator, which interferes with my naive attempt to replace the second slash above with another colon.
How do I use colons in this case for a route?
Вы можете использовать именованный параметр, как описано в CakePHP Cookbook. Напишите приведенный ниже код в вашем app/config/routes.php:
// Parse only the 'prjct' parameter if the current action is 'show' and the controller is 'projects'.
Router::connectNamed(array('prjct' => array('action' => 'show', 'controller' => 'projects')));
// Then set default route to controller 'projects' and action 'show
Router::connect('/', array('controller' => 'projects', 'action' => 'show'));
В вашем project_controller.php :
function show(prjct = null) {
// Check if prjct match the pattern
$pattern = '[-_A-Za-z0-9]+';
if(!preg_match($pattern, prjct)){
// Redirect somewhere else
}
// Rest of your code here
}
Я думаю, что это действительно выходит за рамки простых маршрутов. Я вижу два варианта:
Использовать собственный класс разбора маршрута, как описано здесь. По этой теме не так много документации, но вы можете расширить существующий класс и поэкспериментировать с ним, чтобы понять, что он делает. Затем настройте его под свои нужды.
класс MyRoute расширяет CakeRoute {
анализ публичной функции ($ URL) {
отладка ($ URL); // Вход
$route = родитель::parse($url);
отладка ($ маршрут); // вывод
вернуть $маршрут;
}
}
Направьте эти URL-адреса с помощью универсального маршрута к контроллеру, где параметр будет доступен как именованный параметр в $this->params['named']
. Делайте там то, что вам нужно.