Zend Framework - cms页面路由

时间:2011-02-14 21:06:37

标签: zend-framework zend-route

我有一个CMS,管理员可以在其中构建自己的递归页面结构。每个页面都有自己的“url-key”。接下来,url-key与页面结构结合使用以构建URL结构,以便您获得以下结构:

{rootpage url-key}/{subpage url-key}

可选择启用多语言支持,您还可以获得语言前缀:

{language code}/{rootpage url-key}/{subpage url-key}

我几乎完成了上述工作,为每个页面提供了自己的静态路由,然后将它们链接在一起。

/**
 * Initializes the sites navigation.
 *
 * @param array $pages  An array with the cms pages to initialize
 */
protected function _initNavigation(array $pages = null)
{
    $root = true;

    if ($pages === null) {
        $pages = Sjr_App::get()->getModel('page')->getTree();
        $root = true;
    }

    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter();

    foreach ($pages as $page) {

        $router->addRoute($page->getRouteName(), $page->getRoute());

        if ($page->children) {
            $this->_initNavigation($page->children);
        }
    }
}

$ PAGE-> getRoute():

/**
 * Gets the routing for the page.
 * 
 * @return Zend_Controller_Router_Route_Abstract
 */
public function getRoute()
{
    if ($this->_route === null) {

        $this->_route = new Zend_Controller_Router_Route_Static($this->url_key,
            $this->getNavigationData()
        );

        if ($this->parent) {
            $parentRoute = $this->parent->getRoute();
            $this->_route = $parentRoute->chain($this->_route);
        }
    }
    return $this->_route;
}

接下来,如果支持多语言,我会在语言路由前添加所有路由:

foreach ($front->getRouter()->getRoutes() as $routeName => $route) {
    if ($routeName != 'lang') {
        $front->getRouter()->addRoute($routeName, $this->_languageRoute->chain($route));
    }
}

所有路线都正确组装。但是,一旦页面有和/或是孩子,路线就不匹配。

但除了它还没有工作,我也想知道这是否是最好的方法。页面结构可能会变得非常大,这意味着它还会创建很多路由对象。我不确定这会对性能产生什么影响。

或者我正在考虑编写一个自定义路由器/路由来处理1条路由中的所有cms路由。这也可以更容易地组装cms-urls。

我希望有人能就这个问题给我一些建议。

1 个答案:

答案 0 :(得分:1)

我认为你的方法应该有效(原则上)。当我处理类似的事情时,有一点让我感到困惑的是,你不能将路径链用作“树”,在这里你有一条顶层路线,下面有多个路线选项。

所以如果你有:

/something
/something/foo
/something/bar

这些需要三条完全独立的路线。通过添加/ foo和/ bar,您不能为/您重复使用一个路由对象,期望路由器能够找出要使用的路由器。如果你的$ this->父方法正在重复使用页面,那么这可能就是你的问题所在。

但是,我认为你想知道这是否是最好的方法是对的。它应该适用于小型站点,但是当循环检查路由直到找到匹配时,如果站点有10,000个页面,那么这将是一个非常慢的路由过程,并且路由器将执行大量重复性任务。 / p>

另一种方法是使用自定义路由类,它能够根据数据库中的键检查相关的路由部分。这样你就可以用一条路线完成所有这一切,这会快得多。

我在前面提了blog post一些代码示例,说明了如何以这种方式虚荣网址,所以虽然这是一个不同的问题,但解决方案是相同的(自定义路由类),所以它可能指向你朝着正确的方向前进。