2011-09-02 29 views
0

我正在嘗試使用規範URL並將其與自定義路由類相結合。使用自定義路由類創建規範URL

的URL的方案是這樣的:

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

創建擴展Zend_Controller_Router_Route_Regex並檢查了第123條存在一個自定義的路由類的URL包括了正確的分類名。如果第123條屬於類別-x,並且用戶正在訪問類別-y,我想重定向到正確的URL。

但是路線沒有任何明顯的可能性直接做到這一點。這裏最好的做法是什麼?

回答

0

我結束了此解決方案:

  1. 自定義路由類的比賽創造的規範網址() - 方法是這樣的:

    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()返回數組。

  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)建立規範的網址它只是檢查,如果被請求網址不匹配,重定向到正確的規範網址。

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將需要從您的數據庫數據生成。我經常用這個來驗證一個正確的slu when,當我也拉對象ID。

如果你想使用自定義的而不是使用Regex(你可以繼承它),你也可以將它移動到你的路由類中。