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',
                    ),
                ),
 ),

Модуль Администратор:

/*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 разных модуля для панели инструментов, я загружаю только одно действие.

Как я могу этого добиться?


person mark winkle    schedule 08.04.2015    source источник
comment
Что вы хотите, чтобы произошло? Вы сказали, что пытаетесь использовать два разных имени маршрута, но оба маршрута в вашем примере имеют одно и то же имя, поэтому одно перезапишет другое.   -  person Tim Fountain    schedule 08.04.2015
comment
извини Тим, это были "те же названия маршрутов"   -  person mark winkle    schedule 08.04.2015


Ответы (1)


Я думаю, вы не можете использовать одно и то же имя для двух разных маршрутов. Да, это два разных модуля, но это одно и то же приложение.

Причина в том, что когда Zend\ModuleManager загрузит модули, будет инициировано событие ModuleEvent::EVENT_LOAD_MODULE, а затем listener Zend\ModuleManager\Listener\ConfigListener будет вызывать функцию getConfig() каждого отдельного модуля в вашем приложении. И тогда все Module->getConfig() будут объединены в одну внутреннюю конфигурацию под названием application.config.

Это означает, что когда модули загружены, у вас будет два маршрута с одинаковыми именами, и разница между модулями ни на что не влияет в маршрутизация.

Даже если бы вы могли это сделать, вы столкнетесь с другими проблемами, например, когда захотите использовать Плагин перенаправления, например, для метода toRoute требуется имя маршрута в качестве параметра:

toRoute(строка $route = null, массив $params = array(), массив $options = array(), логическое значение $reuseMatchedParams = false)

Это проблема, если вам нужно вызвать его с тем же именем маршрута.

Возможным решением вашей проблемы является установка одного маршрута и добавление к нему модуля следующим образом:

/dashboard/admin/остальная-адрес-адреса

/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( 
        ), 
    ), 
), 
), 
person blackbishop    schedule 08.04.2015