2012-06-20 79 views
0

帶有多個模塊的Zend項目,每個模塊都有自己的routes.ini。並且在基於模塊的引導文件中使用以下腳本加載每個routes.ini文件。zend根據優先級按順序路由ini加載路由。

protected function _initRoutes() { 
      $frontController = Zend_Controller_Front::getInstance(); 
      $router = $frontController->getRouter(); 
      $routerDir = realpath(dirname(__FILE__)). "/configs/routes/moduleRoutes.ini"; 
      $config = new Zend_Config_Ini($routerDir,'production'); 
      $router->addConfig($config,'routes'); 
    } 

並且所有路線都是在沒有訂單的情況下加載的。因爲路由按照加載順序的相反順序進行檢查,並且首先檢查/執行那些應該稍後檢查/執行的路由。

有沒有一種方法,我可以在每個模塊的routes.ini文件中的每個路由添加一個ORDERBY位(1,2,3,4 ......),並加載它們在特定的順序,以便它會檢查我按順序定義路線。模塊的

典型routes.ini文件看起來是這樣的。

routes.frontindex.type = "Zend_Controller_Router_Route_Regex" 
routes.frontindex.route = "/?(?!login/)([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([0-9_-]+)?" 
routes.frontindex.defaults.module = mymodule1 
routes.frontindex.defaults.controller = mycontroller1 
routes.frontindex.map.page = 1 

routes.siteimage.type = "Zend_Controller_Router_Route_Regex" 
routes.siteimage.route = "siteimage/?([a-zA-Z0-9_-]+)?/?(jpg|png|gif)?" 
routes.siteimage.defaults.module = mymodule1 
routes.siteimage.defaults.controller = mycontroller2 
routes.siteimage.defaults.action = getimage 
routes.siteimage.map.imageid = 1 


routes.sitemapseo.type = "Zend_Controller_Router_Route_Static" 
routes.sitemapseo.route = "sitemap.xml" 
routes.sitemapseo.defaults.module = mymodule1 
routes.sitemapseo.defaults.controller = mycontroller3 
routes.sitemapseo.defaults.action = sitemap 

回答

0

這是可以做到的,但它會採取一些工作,你需要與ZF相當舒適。

您需要擴展Zend_Controller_Router_Rewrite以創建自己的路由器類(您需要使用引導程序中的前端控制器的setRouter()方法進行設置)。在您的路由器類中,您需要:

  • 擴展addRoute方法以添加指示優先級的第三個參數。 (這可能是一個常數,如Your_Router::HIGH_PRIORITY,Your_Router::MEDIUM_PRIORITY等或簡單的數字)。您會看到現有的方法將路由存儲在名爲_routes的數組中。您可以改爲根據優先級參數($this->_highPriorityRoutes$this->_lowPriorityRoutes等)存儲不同陣列中的路由。

  • 擴展route()方法。大部分不幸的是會被剪切和粘貼。但你會看到它呼籲$this->_routesarray_reverse,然後循環儘管這些做匹配。您需要將您的路由數組合併到一起,以便最終結果是首先擁有最高優先級路由的數組。所以,你可能最終的東西,如:

    $routes = array_merge($this->_lowPriorityRoutes, $this->_highPriorityRoutes); 
    $routes = array_reverse($routes, true); 
    
    foreach ($routes as $name => $route) { 
        (...as before) 
    
  • 更新您的INI文件的參數添加到您的路線指示優先。然後在路由器類中擴展addConfig()方法,以便將此參數傳遞給addRoute()方法。

祝你好運!

0

我不相信你可以指定訂單。你必須編寫自己的代碼才能做到這一點。我確信有多種方式,但你有沒有考慮寫一個自定義的Zend Controller Plugin?您可以在routeStartup()方法中創建一個並組裝您的路線。

0

我也嘗試將優先級設置爲中的application.ini的路由。

對於它,我readed的Zend_Controller_Router_Rewrite的代碼。重要功能是addRoute()route()。我的結論非常簡單:路由以oposit順序進行評估,比較application.ini中的順序。

實施例:

如果我在的application.ini

寫routeA

routeB

routeC

routeC將被首先檢查,並且routeB之後和routeA最後。

優先routeC>優先routeB>優先routeA