我需要创建包含冒号的路由来生成http://app.com/prjct:a9b5c
之类的网址。显然,目前使用斜杠代替默认路由非常简单。
$SLUG = array('slug' => '[-_A-Za-z0-9]+');
Router::connect('/prjct/:slug', array('controller' => 'projects', 'action' => 'show'), $SLUG);
但是路由规范使用冒号字符作为特殊指示符,这会干扰我用另一个冒号替换上面第二个斜杠的天真尝试。
在这种情况下,如何为路线使用冒号?
答案 0 :(得分:1)
我认为这确实超出了简单路线的范围。我看到两个选择:
使用自定义路由解析类,如here所述。关于这个主题没有很多文档,但你可以扩展现有的类并使用它来掌握它正在做的事情。然后根据您的需要进行定制。
class MyRoute extends CakeRoute {
public function parse($url) {
debug($url); // input
$route = parent::parse($url);
debug($route); // output
return $route;
}
}
使用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
}