您可以将*
运算符用于路线。
如果您知道路线只有一个子类别,您的路线应该是
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
),并且还稍微更改控制器,但它应该具有足够的可扩展性