2011-03-17 308 views
1

我碰到一個問題,我似乎無法找到一個好的解決方案,使其工作。我必須在Zend Framework項目中製作一些動態路線。我會很快解釋我的問題是什麼:Zend Framework路由器動態路由

我需要動態的自定義路由「擴展」默認路由(module/controller/action/params)。我爲之工作的項目有幾個合作伙伴,路線必須與這些合作。 要存儲我創建靜態類的夥伴,它看起來像這樣。

<?php 
    class App_Partner 
    { 
     static public $partners = array(
      array(
       'name' => 'partner1', 
       'picture' => 'partner1.jpg' 
      ), 
      array(
       'name' => 'partner2', 
       'picture' => 'partner2.jpg' 
      ), 
      array(
       'name' => 'partner3', 
       'picture' => 'partner3.jpg' 
      ) 
     ); 
     static public function routePartners() { 
      $partners = array(); 

      foreach(self::$partners as $partner) { 
       array_push($partners, strtolower($partner['name'])); 
      } 
      $regex = '(' . implode('|', $partners) . ')'; 

      return $regex; 
     } 
    } 

所以App_Partner::routePartners()我返回一個字符串像(partner1|partner2|partner3),我用它來創建正確的路線。我的目標是爲我在Bootstrap中設置的每條路線設置每個合作伙伴的自定義路線。所以如果我有一條路線add-product.html集,我希望它爲每個合作伙伴工作partner1/add-product.html,partner2/add-product.htmlpartner3/add-product.html。 另外,partner1/,partner2/, partner3應該路由到default/index/index

事實上,我讓這件事情使用下面的路線工作。

<?php 
$routeProposal = new Zend_Controller_Router_Route_Regex(
    App_Partner::routePartners() . '?/?proposals.html', 
    array(
     'module' => 'default', 
     'controller' => 'proposal', 
     'action' => 'index', 
     'page' => 1 
    ), 
    array(1 => 'partner'), 
    "%s/proposals.html" 
); 
$router->addRoute('proposal', $routeProposal); 

問題

上述路線工作正常,如果我使用請求URI的合作伙伴,但如果我不這樣做,我得到雙斜線狀public//proposals.html因爲在設置反向路線上面的路線是"%s/proposals.html"。我似乎無法找到一種方法來避免這種反向路由,因爲我使用url查看助手來構建我的網址,如果沒有設置反向路由,我會得到一個異常說明這一點。

我還需要沒有夥伴設置的工作路線,這將是默認方式(add-product.htmlproposals.html等)。

+0

請問這有幫助嗎? http://stackoverflow.com/questions/4626048/zend-framework-how-to-map-fully-dynamic-route – 2011-03-17 09:06:52

+0

我讀過,但它不能幫助我太多。他的路線是獨一無二的。我的地址是「可覆蓋的」 - 幾條路由必須具有相同的名稱,以便我可以使用基於路由名稱的URL助手構建URL。 – 2011-03-17 09:23:03

+0

:-)他的路線是我的路線=相同的用戶。我有一個解決方案,如果別人沒有打敗我,我會在後面寫出來。 – 2011-03-17 09:47:31

回答

6

從你的描述,好像你正在尋找一個zend router chain,你的伴侶的可選鏈。

以下是一個類似的問題,但使用主機名路由:Zend Framework: get subdomain parameter from route。我適應它來解決你的問題,只是把你的bootstrap.php以下初始化路由:您認爲合適的

protected function _initRoute() 
{ 
    $this->bootstrap('FrontController'); 
    $router = $this->getResource('FrontController')->getRouter(); 

    // Default route 
    $router->removeDefaultRoutes(); 
    $defaultRoute = new Zend_Controller_Router_Route(
        ':controller/:action/*', 
        array(
         'module' => 'default', 
         'controller' => 'index', 
         'action' => 'index', 
        ) 
    ); 
    $router->addRoute('default', $defaultRoute); 

    $partnerRoute = new Zend_Controller_Router_Route(
     ':partner', 
     array('partner' => 'none'), 
     array('partner' => '^(partner1|partner2|partner3)$') 
    ); 
    $router->addRoute('partner', $partnerRoute->chain($defaultRoute)); 
} 

變化。在您的控制器中,如果實際指定並且有效(如果合作伙伴不存在,您將得到路由錯誤),您將只獲得夥伴參數的值...

1

我使用類似的過程來檢測lang,在我的路線(但與一個ini文件)。

您可以使用默認值爲您的夥伴參數,使路由工作沒有合作伙伴,並添加一個?到您的正則表達式。

但實際上,我不知道如何避免雙重// ...

希望有所幫助。

編輯:爲了您的信息,這裏是我的路線的簡化版本語言:

routes.lang.type = "Zend_Controller_Router_Route" 
routes.lang.route = "lang/:language/*" 
routes.lang.reqs.language = "^(en|fr|nl|de)?$" 
routes.lang.defaults.language = none 
routes.lang.defaults.module = default 
routes.lang.defaults.controller = index 
routes.lang.defaults.action = language 
+0

事情是我無法使用默認字符串的情況下,我沒有合作伙伴。這種方法基於路由中的強制字符串,與我發佈的路由一起工作。這個問題似乎是在URL視圖助手用來構建URL的反向路線上。 – 2011-03-17 09:20:32