我在CakePHP应用程序中设置了一个类别结构,它支持嵌套类别。也就是说,类别可以有孩子和/或父母。 categories
表的数据库列为:id
,parent_id
,lft
,rght
,name
,slug
。< / p>
我已经为与这些类别相关的类别和帖子编写了所有CRUD逻辑。
例如,假设我有一个名为about
的类别和一个名为me
的子类别。我希望mysite.com/about/me
这样的网址能够显示与me
类别相关的所有帖子。
我在解决如何路由此请求时遇到问题。如果我只是Router::connect('/:category', array('controller' => 'categories', 'action' => 'view'))
它只适用于mysite.com/about
,我不能只执行/:category/:category/:category
,因为它根本无法扩展。
如何实现嵌套类别的路由?
答案 0 :(得分:2)
您可以使用*
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
的传递),并且还稍微更改了控制器,但它应该足够可扩展