1

我在我的 CakePHP 应用程序中设置了一个支持嵌套类别的类别结构。也就是说,一个类别可以有一个孩子和/或一个父母。该表的数据库列categories是:id, parent_id, lft, rght, name, slug.

我已经为类别和与这些类别相关的帖子编写了所有 CRUD 逻辑。

例如,假设我有一个名为的类别about和一个名为 的子类别me。我希望 URL显示与该类别mysite.com/about/me相关的所有帖子。me

我无法确定如何路由此请求。如果我只是这样做Router::connect('/:category', array('controller' => 'categories', 'action' => 'view')),它只会适用于mysite.com/about,我不能只是这样做,/:category/:category/:category因为它根本无法扩展。

如何实现嵌套类别的路由?

4

1 回答 1

2

您可以将* 运算符用于路线

如果您知道路线只有一个子类别,您的路线应该是

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),并且还稍微更改控制器,但它应该具有足够的可扩展性

于 2013-07-02T20:32:29.617 回答