zf2 маршрутизация игнорирует __NAMESPACE__

В Zend Framework 2 я попытался использовать следующий маршрут:

        'default' => array(
'type'    => 'Segment',
'options' => array(
'route'    => '/:username[/:action]',
'defaults' => array(
'__NAMESPACE__' => 'Website\Controller',
'controller'    => 'User',
'action'        => 'index',
),
),
'may_terminate' => true,
),

Однако при переходе на http://www.example.com/MyUsernameHereЯ получаю 404 не найдена ошибка:

Запрошенный контроллер не может быть сопоставлен с существующим классом контроллера.

контроллер:
Пользователь (преобразуется в недопустимый класс контроллера или псевдоним: Пользователь)

Это почти как маршрутизатор полностью игнорирует 'Website\Controller' пространство имен и ищет User без пространства имен перед ним.

Итак, если я вручную введу пространство имен примерно так:

        'default' => array(
'type'    => 'Segment',
'options' => array(
'route'    => '/:username[/:action]',
'defaults' => array(
'controller'    => 'Website\Controller\User',
'action'        => 'index',
),
),
'may_terminate' => true,
),

затем страница загружается, как ожидалось.

Что дает? Может ли '__NAMESPACE__' параметр не будет использоваться для контроллеров? Сайт ZF2 явно дает пример с помощью '__NAMESPACE__', но я не могу заставить это работать на практике. Пример неправильный и устаревший?

3

Решение

Для того, чтобы это работало, как вы ожидали, вы должны приложить ModuleRouteListener менеджеру событий MVC. Вы можете сделать это в своем модуле onBootstrap метод:

public function onBootstrap(MvcEvent $event)
{
//...
$application = $event->getApplication();
$eventManager  = $application->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
//...
}

После того, как вы это сделали, ваш код будет работать как положено.

Они действительно должны были упомянуть об этом на странице с примером, на который вы ссылались в своем вопросе. Вы можете проверить более подробную информацию о модуле слушателя маршрута здесь, в Zend \ Mvc документация. Там пишут:

Этот слушатель определяет, должно ли пространство имен модуля быть добавлено к имени контроллера. Это тот случай, если соответствие маршрута содержит ключ параметра, соответствующий MODULE_NAMESPACE постоянная.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector