使用冒号分隔符的CakePHP路由

时间:2010-08-29 21:53:21

标签: cakephp routing

我需要创建包含冒号的路由来生成http://app.com/prjct:a9b5c之类的网址。显然,目前使用斜杠代替默认路由非常简单。

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

但是路由规范使用冒号字符作为特殊指示符,这会干扰我用另一个冒号替换上面第二个斜杠的天真尝试。

在这种情况下,如何为路线使用冒号?

2 个答案:

答案 0 :(得分:1)

我认为这确实超出了简单路线的范围。我看到两个选择:

  1. 使用自定义路由解析类,如here所述。关于这个主题没有很多文档,但你可以扩展现有的类并使用它来掌握它正在做的事情。然后根据您的需要进行定制。

    class MyRoute extends CakeRoute {
        public function parse($url) {
            debug($url);    // input
            $route = parent::parse($url);
            debug($route);  // output
            return $route;
        }
    }
    
  2. 使用catch-all路由将这些URL路由到控制器,其中该参数将作为$this->params['named']中的命名参数提供。做你需要做的事情。

答案 1 :(得分:1)

您可以按照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'));

在你的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
}