2012-10-25 93 views
8

搜索很長時間後沒有成功。我想問:Zend Framework 2將子域路由到模塊

有沒有辦法將一個子域路由到一個模塊?Zend Framework 2?像:

子域 =>模塊
api.site.com => API
dev.site.com => dev的
admin.site.com =>管理員
site.com = > public
...

我試過這樣做,但我無法訪問控制器而不是默認(索引)。

'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ) 
     ) 
    ), 
), 

謝謝您花時間幫助我。

'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'api.site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Api\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ) 
     ) 
    ), 
), 

等,你的每一個模塊做到這一點:即定義您的子域名主機, -

回答

5

Zend Framework 2沒有路由到模塊的概念;所有路由映射都在URI模式(用於HTTP路由)和特定控制器類之間。也就是說,Zend\Mvc提供了一個事件監聽器(Zend\Mvc\ModuleRouteListener),它允許您根據給定的模式定義映射到多個控制器的URI模式,並因此模擬「模塊路由」。要定義這樣的路線,您會將這是您的路由配置:

'router' => array(
    'routes' => array(
     // This defines the hostname route which forms the base 
     // of each "child" route 
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       // This Segment route captures the requested controller 
       // and action from the URI and, through ModuleRouteListener, 
       // selects the correct controller class to use 
       'default' => array(
        'type' => 'Segment', 
        'options' => array(
         'route' => '/[:controller[/:action]]', 
         'constraints' => array(
          'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
          'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
         ), 
         'defaults' => array(
          'controller' => 'Index', 
          'action'  => 'index', 
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
), 

Click here to see an example of this @ ZendSkeletonApplication

這只是等式的一半,雖然。您還必須使用特定的命名格式在模塊中註冊每個控制器類。這也通過相同的配置文件來完成:

'controllers' => array(
    'invokables' => array(
     'Application\Controller\Index' => 'Application\Controller\IndexController' 
    ), 
), 

數組鍵是別名ModuleRouteListener將使用找到合適的控制器,並且它必須採用以下格式:

<Namespace>\<Controller>\<Action> 

值分配給此數組鍵的是控制器類的完全限定名稱。

Click here to see an example of this @ ZendSkeletonApplication

注:如果您使用的不是ZendSkeletonApplication,或已刪除了它的默認應用程序模塊,你需要在你自己的模塊一個註冊ModuleRouteListener。 Click here to see an example of how ZendSkeletonApplication registers this listener

+2

非常感謝你的解釋清楚和準確。我接受了你的解決方案我在這方面掙扎如此之多。 – Sapher

+0

太棒了,謝謝。 – cr125rider

+0

我使用mamp pro,我在我的虛擬主機名上創建了一個子域名,所以在我使用reseller.myhost.com/test後,它是okey,但是如果我寫入reseller.myhost。COM去應用索引而不是我的模塊 –

4

如果我沒有理解滑動DASPRIDS Rounter Presentation#39正確,它是那樣簡單 - 在每個模塊爲基礎在其自己的。

+0

對不起,如果它似乎愚蠢,但你必須註冊新的web服務器的虛擬主機的api子域? –