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个不同的模块,但我只加载任何一个动作.
我怎样才能做到这一点?
我认为你不能为两条不同的路线命名.是的,这是两个不同的模块,但它是相同的应用程序.
原因是当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)