您可以使用*operator for routes。
如果您知道路线只有一个子类别,那么您的路线应该是
Router::connect('/:category/*',
array('controller' => 'categories', 'action' => 'view'))
这将匹配 mysite.com/about/me 并将其传递给这样的操作
CategoriesController->view('me')
me 将作为参数传递,您可以在该操作中执行所有查询等。
但是,如果类别的嵌套具有您无法定义的长度,则方法会有所不同。假设您还想映射像mysite.com/about/me/2012/march 这样的网址。那么路由规则可以是
Router::connect('/:category/**',
array('controller' => 'categories', 'action' => 'view'))
那个双 ** 在文档中被称为
使用尾随双星,将捕获 URL 的其余部分作为单个传递的参数。当您想使用包含 / 的参数时,这很有用
因此,类别之后的所有内容都将作为参数传递。在这个例子中,它会调用
CategoriesController->view('me/2012/march')
在该操作中,您必须解析参数以获得所需的嵌套。我建议将该函数提取为控制器中的受保护或私有函数
class Categories as AppController {
public function view($url_params) {
//it could be a string or an array or etc, depends on how you want to handle it
$array = $this->_parseCategories($url_params);
}
protected function _parseCategories($stringUrl) {
$subcategories = explode('/', $stringUrl);
//add whatever else you want to do
return $subcategories;
}
}
你应该根据需要调整路由(我没有包括:category的传递),并且稍微改变一下控制器,但它应该具有足够的可扩展性