2013-05-06 67 views
0

我工作的一個項目ZF2 ZF2路由器的配置,我需要配置我的一些模塊在不同的子域工作的以下情形:處理多個子域

  • 我有不同的模塊,如API,後端(管理員),應用(核心 模塊),博客等。
  • 我有多個虛擬主機,它指向同一個 應用程序/ public目錄像api.foobar.com,admin.foobar.com
  • 我使用的唯一每個模塊中的控制器鍵/別名,如下所示:

...

'controllers' => array(
    'invokables' => array(
     'home-controller'  => 'Application\Controller\IndexController', 
    ), 
), 

所以,我想基於域改變我的應用程序的行爲(主機名/ routeMatch),如果主機看起來像api.foobar.com我的默認控制器應該得到的形成寧靜控制器,如果它是一個通用的主頁請求,我認證的管理員控制器不應該調用,如果它是移動站點,則將家庭控制器更改爲移動控制器,利用不同的佈局等...

非工作配置(應用程序/ config/module.config.php):

return array(
    'router' => array(
     'routes' => array(
      'home' => array(
       'type' => 'hostname', 
       'options' => array(
        'route' => 'www.foobar.com', 
        'defaults' => array(
         '__NAMESPACE__' => 'Application\Controller', 
         'controller' => 'home-controller', 
         'action' => 'index' 
        ) 
       ) 
      ), 
      'api' => array(
       'type' => 'hostname', 
       'options' => array(
        'route' => 'api.foobar.com', 
        'constraints' => array(
         'subdomain' => 'api', 
        ), 
        'defaults' => array(
         '__NAMESPACE__' => 'Api\Controller', 
         'controller' => 'api-controller', 
         'action' => 'index' 
        ) 
       ) 
      ), 
      'admin' => array(
       'type' => 'hostname', 
       'options' => array(
        'route' => 'admin.foobar.com', 
        'constraints' => array(
         'subdomain' => 'admin', 
        ), 
        'defaults' => array(
         '__NAMESPACE__' => 'Admin\Controller', 
         'controller' => 'admin-controller', 
         'action' => 'index' 
        ) 
       ), 
       'may_terminate' => true, 
       'child_routes' => array(
        'default' => array(
         'type' => 'Segment', 
         'options' => array(
          'route' => '/[:controller[/:action]]', 
          'constraints' => array(
           '__NAMESPACE__' => 'Admin\Controller', 
           'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
           'action' => '[a-zA-Z][a-zA-Z0-9_-]*' 
          ), 
          'defaults' => array() 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

有趣的是,目前這個配置我得到一個404頁面沒有發現錯誤api.foobar.com,www.foobar.com和admin.foobar.com在我的開發環境和轉儲的路線如下:

object(Zend\Mvc\Router\PriorityList)[214] 
    protected 'routes' => 
    array (size=3) 
     'home' => 
     array (size=3) 
      'route' => 
      object(Zend\Mvc\Router\Http\Hostname)[216] 
       ... 
      'priority' => int 0 
      'serial' => int 0 
     'admin' => 
     array (size=3) 
      'route' => 
      object(Zend\Mvc\Router\Http\Part)[218] 
       ... 
      'priority' => int 0 
      'serial' => int 1 
       ... 
      'priority' => int 0 
      'serial' => int 2 
    protected 'serial' => int 3 
    protected 'count' => int 3 
    protected 'sorted' => boolean false 

我在應用模塊> Module.php> onBootstrap($ E)方法簡單地得到這個轉儲: $路徑= $ E-> getApplication() - > getServiceManager->獲取('路由器「) - > getRoutes();

問題:

  1. 什麼不對這個CONFIGRATION?
  2. 爲什麼我的頂級管理路由列爲Zend \ Mvc \ Router \ Http \ Part
  3. 我應該將路由定義分隔到本場景的每個模塊自己的module.config.php文件中嗎?

回答

1

---什麼是錯的這個配置

它運作良好,在我的測試,你可以參考代碼底部。 因此,我建議你應該檢查:

  1. 確保控制器/操作文件存在
  2. 確保虛擬主機已在Apache中已經配置/ nginx的/,無論HTTP主機所使用。

---爲什麼我的頂級管理路由列表爲Zend \ Mvc \ Router \ Http \ Part?

actully,你的「管理員」路線配置了孩子的路線,ZF2將把它作爲「部分」的路線,請參閱Zend\Mvc\Router\Http\Part example

---我應該路由定義分開,每個模塊本身的module.config這個場景的.php文件?

不,實際上你可以把所有的模塊路由放在一個模塊的配置文件中,如果你喜歡的話。

這裏是我的代碼: 返回數組

(
    'router' => array(
     'routes' => array(
       /* 
      'home' => array(
       'type' => 'Zend\Mvc\Router\Http\Literal', 
       'options' => array(
        'route' => '/', 
        'defaults' => array(
         'controller' => 'Application\Controller\Index', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
      */ 
      'home1' => array(
        'type' => 'hostname', 
        'options' => array(
          'route' => 'zfskeleton.com', 
          'defaults' => array(
            '__NAMESPACE__' => 'Application\Controller', 
            'controller' => 'Index', 
            'action' => 'index' 
          ) 
        ) 
      ), 
      'home' => array(
        'type' => 'hostname', 
        'options' => array(
          'route' => 'www.zfskeleton.com', 
          'defaults' => array(
            '__NAMESPACE__' => 'Application\Controller', 
            'controller' => 'Index', 
            'action' => 'index' 
          ) 
        ) 
      ), 
      'api' => array(
        'type' => 'hostname', 
        'options' => array(
          'route' => 'api.zfskeleton.com', 
          'constraints' => array(
            'subdomain' => 'api', 
          ), 
          'defaults' => array(
            '__NAMESPACE__' => 'Album\Controller', 
            'controller' => 'Album', 
            'action' => 'api' 
          ) 
        ) 
      ), 
      'admin' => array(
        'type' => 'hostname', 
        'options' => array(
          'route' => 'admin.zfskeleton.com', 
          'constraints' => array(
            'subdomain' => 'admin', 
          ), 
          'defaults' => array(
            '__NAMESPACE__' => 'Album\Controller', 
            'controller' => 'Album', 
            'action' => 'admin' 
          ) 
        ), 
        'may_terminate' => true, 
        'child_routes' => array(
          'default' => array(
            'type' => 'Segment', 
            'options' => array(
              'route' => '/[:controller[/:action]]', 
              'constraints' => array(
                '__NAMESPACE__' => 'Admin\Controller', 
                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
                'action' => '[a-zA-Z][a-zA-Z0-9_-]*' 
              ), 
              'defaults' => array() 
            ) 
          ) 
        ) 
      ), 
      // The following is a route to simplify getting started creating 
      // new controllers and actions without needing to create a new 
      // module. Simply drop new controllers in, and you can access them 
      // using the path /application/:controller/:action 
      'application' => array(
       'type' => 'Literal', 
       'options' => array(
        'route' => '/application', 
        'defaults' => array(
         '__NAMESPACE__' => 'Application\Controller', 
         'controller' => 'Index', 
         'action'  => 'index', 
        ), 
       ), 
       'may_terminate' => true, 
       'child_routes' => array(
        '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(
          ), 
         ), 
        ), 
       ), 
      ), 
     ), 
    ),