Конфигурация маршрутизатора ZF2
Я новичок в ZF2, но я пытаюсь написать приложение. И я столкнулся с проблемой с invokables и конфигурацией маршрутизации.
У меня есть 2 модуля с конфигами:
<?php
return array(
'controllers' => array(
'invokables' => array(
'Index' => 'Vocabulary\Controller\IndexController'
,'Add' => 'Vocabulary\Controller\AddController'
,'Admin' => 'Vocabulary\Controller\AdminController'
)
)
,'router' => array(
'routes' => array(
'vocabulary' => array(
'type' => 'segment'
,'options' => array(
'route' => '/vocabulary[/:controller][/:action]'
,'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*'
,'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
)
,'defaults' => array(
'controller' => 'Index'
,'action' => 'index'
)
)
)
)
)
а также
<?php
return array(
'controllers' => array(
'invokables' => array(
'Admin' => 'Lang\Controller\AdminController'
,'Translation' => 'Lang\Controller\TranslationController'
)
)
,'router' => array(
'routes' => array(
'lang' => array(
'type' => 'segment'
,'options' => array(
'route' => '/lang[/:controller][/:action]'
,'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*'
,'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
)
,'defaults' => array(
'controller' => 'Admin'
,'action' => 'index'
)
)
)
)
)
Но на странице / лексике / admin я вижу содержимое страницы /lang/admin. Кажется, проблема в том, что ключи вызываемого массива "Admin" равны. Как я могу изменить мою конфигурацию, чтобы приложение работало правильно? Я хочу сохранить пути "lang / admin" и "vocabulary / admin".
Я пытался использовать "Vocabulary\Controller\Admin" вместо "Admin" в качестве вызываемого ключа, но это не помогло.
ОБНОВИТЬ
Я решил проблему, используя этот вариант конфигурации (надеюсь, он кому-нибудь пригодится):
return array(
'controllers' => array(
'invokables' => array(
'Lang\Controller\Admin' => 'Lang\Controller\AdminController'
,'Lang\Controller\Translation' => 'Lang\Controller\TranslationController'
)
)
,'router' => array(
'routes' => array(
'lang' => array(
'type' => 'Literal'
,'options' => array(
'route' => '/lang'
,'defaults' => array(
'__NAMESPACE__' => 'Lang\Controller',
'controller' => 'Lang\Controller\Admin'
,'action' => 'index'
)
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller][/:action]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
),
),
),
),
)
)
)
В этом случае вспомогательная команда вида $this->url('lang', array('controller' => 'translation')) возвращает только "lang/", но я использую $this->serverUrl('/lang/translation "); Оба модуля работают правильно.
2 ответа
Чтобы ответить на последнюю часть вашего вопроса (как я согласен с @ChanlderTi в первой части):
В этом случае вспомогательная команда вида $this->url('lang', array('controller' => 'translation')) возвращает только "lang/"
Это связано с тем, что маршрут "lang" является буквальным обозначением только "lang/". То, что вы пытаетесь сделать, это определить URL-адрес дочернего маршрута, полное имя которого "lang / default". Итак, ваш код должен быть:
$this->url('lang/default', array('controller' => 'translation'))
Вероятно, вам следует определить действие по умолчанию для дочернего маршрута. Хотя я не помню, будет ли Маршрутизатор по умолчанию индексировать, если не указано никакого действия.
Вы можете просто определить ваши invokables и маршруты, используя полное пространство имен, как в
'controllers' => array(
'invokables' => array(
'Vocabulary\Controller\Index' => 'Vocabulary\Controller\IndexController'
,'Vocabulary\Controller\Add' => 'Vocabulary\Controller\AddController'
,'Vocabulary\Controller\Admin' => 'Vocabulary\Controller\AdminController'
)
)
а также
'controllers' => array(
'invokables' => array(
'Lang\Controller\Admin' => 'Lang\Controller\AdminController'
,'Lang\Controller\Translation' => 'Lang\Controller\TranslationController'
)
)
а затем отрегулируйте defaults
ключи для каждого раздела маршрутизации, чтобы иметь новый ключ с полным пространством имен. т.е.
'defaults' => array(
'controller' => 'Lang\Controller\Admin'
,'action' => 'index'
)
Лично я предпочитаю включать полное пространство имен, так как мне становится понятнее, куда указывает мой код. Вам не нужно этого делать, но вызываемые для ваших контроллеров нельзя дублировать, так как эта конфигурация объединена в один большой массив конфигурации с последним определенным выигрышем. Итак, ваше определение для вызываемого ключа Admin
как Lang\Controller\AdminController
перезаписывает ваше предыдущее назначение этого ключа Vocabulary\Controller\AdminController
,