zend框架2 - 在两个不同的模块中使用相同的路由名称的问题

时间:2015-04-08 14:46:16

标签: php zend-framework2 zend-route zend-router

我试图为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',
                    ),
                ),
  ),

尽管我正在为仪表板创建2个不同的模块,但我只加载任何一个动作。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:5)

我认为两条不同路线的名称不能相同。是的,它是两个不同的模块,但它是相同的应用程序。

原因是当Zend\ModuleManager加载模块时,将触发事件ModuleEvent::EVENT_LOAD_MODULE,然后listener Zend\ModuleManager\Listener\ConfigListener 将调用应用程序中每个模块的函数getConfig()。然后,所有Module->getConfig()将合并到一个名为application.config的内部配置中。

这就是说,当加载模块时,你会有两条同名的路由,模块之间的差异并不影响routing中的任何内容。

即使可以这样做,您也会遇到其他问题,例如当您想要使用Redirect Plugin时,toRoute方法需要路由名称作为参数:

  

toRoute (string $ route = null,array $ params = array(),        array $ options = array(),boolean $ reuseMatchedParams = false)

如果您必须使用相同的路径名称调用它,则会出现此问题。

您的问题的可能解决方案是设置一个路线并将模块添加到其中,如下所示:

<强> /仪表板/管理/的静止的最-网址

<强> /仪表板/用户/所述静止的最-网址

您的路线配置中会有类似的内容:

'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( 
        ), 
    ), 
), 
),