嵌套类别的路由

时间:2013-07-02 20:19:05

标签: php cakephp routing

我在CakePHP应用程序中设置了一个类别结构,它支持嵌套类别。也就是说,类别可以有孩子和/或父母。 categories表的数据库列为:idparent_idlftrghtnameslug。< / p>

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

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

我在解决如何路由此请求时遇到问题。如果我只是Router::connect('/:category', array('controller' => 'categories', 'action' => 'view'))它只适用于mysite.com/about,我不能只执行/:category/:category/:category,因为它根本无法扩展。

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

1 个答案:

答案 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的传递),并且还稍微更改了控制器,但它应该足够可扩展