使用自定义路由类创建规范URL

时间:2011-09-02 13:21:15

标签: php zend-framework routes

我正在尝试实现规范网址并将其与自定义路由类结合使用。

URL方案是这样的:

/category-x/article/123
/category-y/article/123

我创建了一个扩展Zend_Controller_Router_Route_Regex的自定义路由类,并检查文章123是否存在以及该URL是否包含正确的类别名称。如果文章123属于category-x且用户正在访问category-y,我想重定向到正确的URL。

但是这些路线没有任何明显的可能性直接这样做。这里最好的做法是什么?

2 个答案:

答案 0 :(得分:0)

我经常在动作控制器中执行此操作。像这样......

// assuming GET /category-y/article/123
// $article->url is generated, and contains /category-x/article/123

if (this->_request->getRequestUri() != $article->url) {
    return $this->_helper->redirector->goToUrl($article->url);
}

在此示例中,需要从数据库数据生成$ article-> url。当我同时拉入对象id时,我经常使用它来验证正确的slu。

如果你想使用自定义的一个而不是使用Regex(你可以将它子类化),你也可以将它移到路由类中。

答案 1 :(得分:0)

我最终得到了这个解决方案:

  1. 自定义路由类在其match()中创建规范URL - 方法如下:

    public function match($path, $partial = false) {
        $match = parent::match($path, $partial);
    
        if (!empty($match)) {
             $article = $this->backend->getArticle($match['articleId']);
    
             if (!$article) {
                 throw new Zend_Controller_Router_Exception('Article does not exist', 404);
             }
    
             $match['canonicalUrl'] = $this->assemble(array(
                 'title' => $article->getTitle(), 
                 'articleId' => $article->getId()
            ));
        }
    
        return $match;
    }
    
    如果parent :: match()返回数组,则在match()中填充$ article。

  2. 我创建了一个前端控制器插件,它挂在routeShutdown()上,如下所示:

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        if ($request->has('canonicalUrl')){
            $canonicalUrl = $request->getBaseUrl() . '/' . $request->get('canonicalUrl');
    
            if ($canonicalUrl != $request->getRequestUri()) {
                $this->getResponse()->setRedirect($canonicalUrl, 301);
            }
        }
    }
    

    它只是检查路由(自定义或本机Zend)是否创建了规范URL,如果请求的URL不匹配,则重定向到正确的规范URL。