2010-11-10 189 views
5

我需要建立在Zend的路由簡單地複製當前活動站點的URL結構這是可悲的不一致如何路由多子域與Zend路由器的主機名

我想要做的是路線的子域如下:

www.site.com - >靜態路由器

a.site.com & b.site.com - >類別控制器

c.site.com & d.site.com - >位置控制器

其餘的子域 - >用戶控制器

任何人都可以指導我如何解決這個問題,謝謝。

UPDATE:

首先感謝FGE,投你的答案,它的工作原理,但我需要一些更多的建議:

  1. ,因爲我已經爲每個規則的許多子域有沒有更好的辦法比加在循環

    的foreach($子域爲$ a){$ TR =新Zend_Controller_Router_Route_Hostname規則( 「$ a.site.com」, 陣列( '模塊'=>「莫d', 'controller'=>'ctrl', 'param_1'=> $ a )); $ router-> addRoute($ a,$ tr); }

  2. 如何將它與其他路由類型解析參數(鏈接?),像http://a.site.com/:b/:c結合起來,我想牛逼解析它PARAM_1(一),PARAM_2(B),PARAM_2(C)

+0

對不起,似乎代碼格式不起作用? – Komang 2010-11-10 13:02:12

回答

6

注意:反匹配
路由被 以相反的順序相匹配,以便確保 最通用的路由被定義 第一。

(Zend_Controller_Router)

因此,你必須首先定義所有其他子域的路由,那麼具體的:

$user = new Zend_Controller_Router_Route_Hostname(
    ':subdomain.site.com', 
    array(
     'controller' => 'user' 
    ) 
); 
$location1 = new Zend_Controller_Router_Route_Hostname(
    'c.site.com', 
    array(
     'controller' => 'location' 
    ) 
); 
$location1 = new Zend_Controller_Router_Route_Hostname(
    'd.site.com', 
    array(
     'controller' => 'location' 
    ) 
); 
// other definitions with known subdomain 
$router->addRoute($user); // most general one added first 
$router->addRoute($location1); 
$router->addRoute($location2); 
// add all other subdomains 

更新更新的問題:
1)本真取決於您想要將子域路由到的參數的差異。在你的例子中,你將它們全部路由到相同的模型和控制器,並將實際的子域添加爲參數。這可以通過上面發佈的用戶路由輕鬆完成。在那裏子域被設置爲參數子域($request->getParam("subdomain"))。如果您希望子域名成爲已知控制器/模型的行爲,您可以用:action替換:subdomain。但是,只要你有每個子域的其他控制器/模型,我擔心你必須循環它們(或使用配置文件)。對於你的問題提供的示例,路線根本就這個樣子:

$user = new Zend_Controller_Router_Route_Hostname(
    ':param1.site.com', 
    array(
     'controller' => 'user' 
    ) 
); 
// routes "subdomain".site.com to defaultModul/userController/indexAction with additional parameter param1 => subdomain. 

只要你沒有在你的子域路由他們的任何模式就很難在一般的方式。

2)這是router chains發揮作用的一個例子。外部路由將是處理子域的主機名路由,而內部路由將處理:a/:b部分。這可能看起來像這樣,例如:

$user->chain(new Zend_Controller_Router_Route(':a/:b')); 
+0

謝謝,它的工作原理,投票你的答案,但請看看我上面的更新。 – Komang 2010-11-10 13:01:38

+0

@ariel更新了答案。 – Fge 2010-11-10 13:37:38

+0

岩石我做到了,謝謝 – Komang 2010-11-10 13:52:01