1

我正在尝试为 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 个不同的模块,但我只加载了任何一个操作。

我怎样才能做到这一点?

4

1 回答 1

6

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

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

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

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

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

如果您必须使用相同的路由名称调用它,这将是一个问题。

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

/dashboard/admin/the-rest-of-the-url

/dashboard/user/the-rest-of-the-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( 
        ), 
    ), 
), 
), 
于 2015-04-08T16:14:15.183 回答