2015-04-08 28 views
1

我想爲2個不同的模塊使用相同的路由名稱,這有可能嗎?zend框架2 - 在兩個不同的模塊中使用相同的路由名稱的問題

模塊用戶

/*Module.config.php*/ 

'dashboard' => array(
       'type' => 'segment', 
       'options' => array(
        'route' => '/dashboard', 
        'constraints' => array(
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        ), 
        'defaults' => array(
         'controller' => 'Users\Controller\Users', 
         'action'  => 'dashboard', 
        ), 
       ), 
), 

模塊管理員:

/*Module.config.php*/ 

'dashboard' => array(
       'type' => 'segment', 
       'options' => array(
        'route' => '/dashboard', 
        'constraints' => array(
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        ), 
        'defaults' => array(
         'controller' => 'Admin\Controller\Admin', 
         'action'  => 'dashboard', 
        ), 
       ), 
), 

Eventhough我創建用於儀表板2個不同的模塊,我只加載任何一個動作。

我該如何做到這一點?

+1

你想要發生什麼?你說你試圖使用兩個不同的路由名稱,但是你的例子中的兩個路由都有相同的名字,所以一個會覆蓋另一個。 –

+0

對不起,這是'相同的路線名稱' –

回答

5

我想你不能有兩個不同的路線相同的名稱。是的,它是兩個不同的模塊,但它是同一個應用程序。

的原因是,當Zend\ModuleManager加載模塊,事件ModuleEvent::EVENT_LOAD_MODULE將被觸發,然後listenerZend\ModuleManager\Listener\ConfigListener 將調用每個單個模塊的功能getConfig()您的應用程序。然後,所有的Module->getConfig()將被合併到一個名爲application.config的內部配置中。

這就是說,當模塊被加載時,您將擁有兩個具有相同名稱的路由,並且模塊之間的差異不會影響routing中的任何內容。

即使能做到這一點,你會遇到其他問題,當你想使用Redirect Plugin,例如toRoute方法所需要的航線名稱參數爲:

toRoute(字符串$路線=空,數組$ PARAMS =陣列(), 數組$選項=陣列(),布爾$ reuseMatchedParams = FALSE)

這是一個問題,如果你有同樣的路線名字來稱呼它。

您的問題可能的解決方案是設置一個路由和模塊添加到它,如下所示:

/儀表板/管理/在休息的最-URL

/儀表板/用戶/該休息的最-URL

你有這樣的事情在你的路由配置:

'dashboard' => array( 
'type' => 'segment', 
'options' => array( 
    'route' => '/dashboard[/:module][/:controller][/:action][/:id]', 
    'constraints' => array( 
     'module'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
     'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
     'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
     'id'   => '[0-9]+', 
    ), 
    'defaults' => array( 
     'controller' => 'Application', 
     'action'  => 'index', 
    ), 
), 
'may_terminate' => true, 
'child_routes' => array( 
    'default' => array( 
     'type' => 'Wildcard', 
     'options' => array( 
     ), 
    ), 
), 
),