Маршрутизация 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 not found:

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

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

Это похоже на то, что маршрутизатор полностью игнорирует пространство имен '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__', но я не могу заставить его работать на практике. Является ли пример неправильным и устаревшим?


person Leo Galleguillos    schedule 19.01.2017    source источник


Ответы (1)


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

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

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

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

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

person Wilt    schedule 19.01.2017
comment
Это работает; Спасибо большое. Изначально мы перенесли этот код из приложения Skeleton, потому что не понимали его назначения и хотели обойти любые ненужные задачи. - person Leo Galleguillos; 20.01.2017