我正在尝试为两个不同的模块使用相同的路由名称,这可能吗?
模块用户:
/*Module.config.php*/
'dashboard' => array(
'type' => 'segment',
'options' => array(
'route' => '/dashboard',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'controller' => 'UsersControllerUsers',
'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' => 'AdminControllerAdmin',
'action' => 'dashboard',
),
),
),
尽管我为仪表板创建了两个不同的模块,但我只加载任何一个操作。
我怎样才能做到这一点?
我认为两个不同的路由不能有相同的名称。是的,它是两个不同的模块,但它是同一个应用程序。
原因是当Zend\ModuleManager加载模块时,会触发事件ModuleEvent::EVENT_LOAD_MODULE
,然后侦听器ZendModuleManagerListenerConfigListener
将调用应用程序中每个模块的函数getConfig()
。然后,所有的Module->getConfig()
将合并为一个名为application.config
的内部配置。
也就是说,当加载模块时,将有两个名称相同的路由,并且模块之间的差异不会影响路由中的任何内容。
即使可以这样做,当你想使用重定向插件时,你也会遇到其他问题,例如toRoute
方法需要路由名称作为参数:
toRoute(字符串$route=null,数组$params=array(),array$options=array(),boolean$reuseMatchedParams=false)
如果你必须用相同的路由名称来调用它,这就是一个问题。
您的问题的一个可能的解决方案是设置一条路线并将模块添加到其中,如下所示:
/仪表板/admin/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(
),
),
),
),