2010-08-29 3 views
1

Мне нужно создать маршруты, которые включают двоеточие, для создания URL-адресов, таких как http://app.com/prjct:a9b5c. Очевидно, что в настоящее время просто использовать косую черту вместо стандартной маршрутизации.Маршрутизация CakePHP с разделителем двоеточия

$SLUG = array('slug' => '[-_A-Za-z0-9]+'); 
Router::connect('/prjct/:slug', array('controller' => 'projects', 'action' => 'show'), $SLUG); 

Но маршруты спецификации использовать двоеточие как специальный индикатор, который мешает моей наивной попыткой заменить второй слэш выше с другой толстой кишки.

Как использовать двоеточие в этом случае для маршрута?

ответ

1

Вы можете использовать именованный параметр, как описано в CakePHP Cookbook. Написать код, приведенный ниже в приложении/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')); 

В вашем projects_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

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

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

    class MyRoute extends CakeRoute { 
        public function parse($url) { 
         debug($url); // input 
         $route = parent::parse($url); 
         debug($route); // output 
         return $route; 
        } 
    } 
    
  2. Направьте эти URL-адрес с броским всем маршрутом к контроллеру, где параметр будет доступен в качестве имени параметра в $this->params['named']. Сделайте то, что вам нужно сделать там.

Смежные вопросы