CakePHP routing with colon separator

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?

1
задан Benjamin 27 December 2013 в 11:48
поделиться

2 ответа

Вы можете использовать именованный параметр, как описано в 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
} 
1
ответ дан 2 September 2019 в 21:44
поделиться

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

  1. Использовать собственный класс разбора маршрута, как описано здесь. По этой теме не так много документации, но вы можете расширить существующий класс и поэкспериментировать с ним, чтобы понять, что он делает. Затем настройте его под свои нужды.

     класс MyRoute расширяет CakeRoute {
    анализ публичной функции ($ URL) {
    отладка ($ URL); // Вход
     $route = родитель::parse($url);
    отладка ($ маршрут); // вывод
    вернуть $маршрут;
     }
    }
    
  2. Направьте эти URL-адреса с помощью универсального маршрута к контроллеру, где параметр будет доступен как именованный параметр в $this->params['named']. Делайте там то, что вам нужно.

1
ответ дан 2 September 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: