2009-10-31 32 views
4

我試圖創建將 「覆蓋」 這樣的URL路徑:Zend的路由地址與正則表達式

www.test.com/parent1/parent2/parent3/item

WWW .test.com/parent1/parent2/parent3/parent4 /物品1

在數目不詳的父母,應該只會提供更好,更直觀的外觀網站的網址。主要參數是「item」。

我想這只是解決方法是使用Route_Regex,所以我試圖完成這條路線的任務像這樣的東西:

routes.test.type = "Zend_Controller_Router_Route_Regex" 
routes.test.route = "test/(?:.*)?([^\/]+)" 
routes.test.defaults.module = default 
routes.test.defaults.controller = test 
routes.test.defaults.action = index 
routes.test.map.1 = "path" 
routes.test.map.2 = "item" 
routes.test.reverse = "test/%s%s" 

我沒有測試這個樣,因爲我我不確定自己做的是否正確......我不知道該正則表達式應該是什麼樣子,我應該如何對待這條「路徑」。

你能建議我該怎麼做才能滿足這種路線需求?所以,我需要的路徑(parent1,parent2等)只用於外觀,主要參數是「項」...

回答

-2

我不知道什麼是路由(是什麼PHP相關?),但如果你可以正常使用編程功能則一個比一個正則表達式更簡單的解決方案是使用內置列表/拆分功能,例如:

end(explode($Url,'/')) 

Url.split('/').last() 

ListLast(Url,'/') 


如果你確實需要一個正則表達式,你可以簡單地使用它:

[^/]+$ 

這會給你最後一個正斜槓後的所有內容,直到行尾。
(你只需要一個反斜槓逃脫/,如果你在這方面需要逃避使用它。)


(順便說一句,在你的榜樣,你有test/在開始 - 是這是故意的還是必需的?)

+0

Zend Route是Zend框架的一部分,它是一個衆所周知的PHP框架。 – 2012-05-23 00:40:57

+1

這很有趣:)投票了 – Green 2012-10-14 21:55:49

+0

這傢伙有33k代表?這甚至不是你在那裏寫的PHP代碼。 – 2013-03-07 10:56:20

7

我知道這是一個老問題,但我有一個類似的問題,只是想我應該發佈我的解決方案。也許它可以幫助其他人查看這個問題。

,我寫我的路線在一個插件,很明顯,你需要將插件添加到系統啓動時進行這項工作;)

class Plugin_RoutesPage extends Zend_Controller_Plugin_Abstract 
{ 
    public function routeStartup(Zend_Controller_Request_Abstract $request) 
    { 
     $front_controller = Zend_Controller_Front::getInstance(); 
     $router = $front_controller->getRouter(); 

     // Page SEO friendly hierarchical urls 
     $routePageSeoTree = new Zend_Controller_Router_Route_Regex(
      '([-a-zA-Z0-9/]+)/([-a-zA-Z0-9]+)', 
      array(
       // default Route Values 
       'controller' => 'page', 
       'action' => 'open', 
      ), 
      array(
       // regex matched set names 
       1 => 'parents', 
       2 => 'item' 
      ) 
     ); 
     $router->addRoute('page-seo-tree',$routePageSeoTree); 

     // only one level 
     $routeSinglePage = new Zend_Controller_Router_Route_Regex(
      '([-a-zA-Z0-9]+)', 
      array(
       // default Route Values 
       'controller' => 'page', 
       'action' => 'open', 
      ), 
      array(
       // regex matched set names 
       1 => 'item' 
      ) 
     ); 
     $router->addRoute('page-single',$routeSinglePage); 
    } 
} 

這是你如何可以在控制器的動作用它

class PageController extends Zend_Controller_Action 
{ 
    public function openAction() 
    { 
     // the part of the uri that you are interested in 
     $item = $this->_request->getParam('item'); 
    } 
} 

這裏的

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initPlugins() 
    { 
      $front_controller = Zend_Controller_Front::getInstance(); 

      $front_controller->registerPlugin(new Plugin_RoutesPage(), 1); 
    } 
} 

我不得不用的如何將其納入到你的自舉一個簡單的例子兩條路線,因爲我們試圖查看/打開的當前頁面可能沒有父母。我相信可能有更好的方法來編寫正則表達式,但這對我來說很有用。如果有人知道如何改進正則表達式,請讓我知道。

1

如果父項是完全不重要,一個簡單的解決辦法可能是刪除它們,他們甚至達到Zend公司之前 - 也就是重寫URL,這樣它只有每看到test/:item

例如,使用:

RewriteEngine On 
RewriteRule ^(test/).*/([^/]+) $1$2 [L] 

( 「測試/」 部分顯然可以改變或按需要動態效果。)

即進入Apache的網站配置文件 - 或共享主機上的.htaccess文件。

如果您沒有使用Apache,請檢查您使用的任何Web服務器的URL重寫功能 - 語法可能略有不同,但會相似。