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

mar*_*kle 1 php zend-route zend-router zend-framework2

我试图为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',
                    ),
                ),
 ),
Run Code Online (Sandbox Code Playgroud)

模块管理员:

/*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',
                    ),
                ),
  ),
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

bla*_*hop 6

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

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

这就是说,当加载模块时,您将拥有两个具有相同名称的路由,并且模块之间的差异不会影响路由中的任何内容.

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

toRoute(string $ route = null,array $ params = array(),array $ options = array(),boolean $ 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( 
        ), 
    ), 
), 
), 
Run Code Online (Sandbox Code Playgroud)