В 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__'
, но я не могу заставить это работать на практике. Пример неправильный и устаревший?
Для того, чтобы это работало, как вы ожидали, вы должны приложить ModuleRouteListener
менеджеру событий MVC. Вы можете сделать это в своем модуле onBootstrap
метод:
public function onBootstrap(MvcEvent $event)
{
//...
$application = $event->getApplication();
$eventManager = $application->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
//...
}
После того, как вы это сделали, ваш код будет работать как положено.
Они действительно должны были упомянуть об этом на странице с примером, на который вы ссылались в своем вопросе. Вы можете проверить более подробную информацию о модуле слушателя маршрута здесь, в Zend \ Mvc документация. Там пишут:
Этот слушатель определяет, должно ли пространство имен модуля быть добавлено к имени контроллера. Это тот случай, если соответствие маршрута содержит ключ параметра, соответствующий
MODULE_NAMESPACE
постоянная.
Других решений пока нет …