Zend Framework 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',
),
),
),
Модуль Admin:
/*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 ответ
Я думаю, что вы не можете иметь одно и то же имя для двух разных маршрутов. Да, это два разных модуля, но это одно и то же приложение.
Причина в том, что когда Zend\ModuleManager загружает модули, событие ModuleEvent::EVENT_LOAD_MODULE
будет срабатывать, а затем слушатель Zend\ModuleManager\Listener\ConfigListener
вызовет функцию getConfig()
каждого модуля в вашем приложении. А потом все Module->getConfig()
будет объединен в одну внутреннюю конфигурацию application.config
,
Это означает, что при загрузке модулей у вас будет два маршрута с одинаковым именем, и разница между модулями не влияет на маршрутизацию.
Даже если бы вы могли это сделать, вы столкнетесь с другими проблемами, например, когда вы захотите использовать плагин перенаправления, например toRoute
Методу нужно указать имя маршрута в качестве параметра:
toRoute(строка $route = null, массив $params = array(), массив $options = array(), логическое $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(
),
),
),
),