2016-08-14 2 views
2

Я использую этот конфиг как мой модуль приложения конфигурация в Zend2, который действительно нормально, и каждый предлагаемый в качестве стандартного правила маршрутизации:Zend2 маршрутизация __NAMESPACE__ не работает или игнорироваться

'controllers' => array(
    'invokables' => array(
     'Application\Controller\Index' => 'Application\Controller\IndexController', 
    ), 
), 
'router'  => array(
    'routes' => array(
     'home' => array(
      'type' => 'Zend\Mvc\Router\Http\Literal', 
      'options' => array(
       'route' => '/', 
       'defaults' => array(
        'controller' => 'Application\Controller\Index', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
     'application' => array(
      'type' => 'Zend\Mvc\Router\Http\Literal', 
      'options' => array(
       'route' => '/application', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       'default' => array(
        'type' => 'Zend\Mvc\Router\Http\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(
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
), 

маршрутизации home работает отлично. но http://localhost/application я получаю:

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

и http://localhost/application/index/index я получаю:

индекса (устраняющий недопустимый класс контроллера или псевдоним: индекс)

если я это изменение:

'application' => array(
      'type' => 'Zend\Mvc\Router\Http\Literal', 
      'options' => array(
       'route' => '/application', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ), 

к этому:

'application' => array(
      'type' => 'Zend\Mvc\Router\Http\Literal', 
      'options' => array(
       'route' => '/application', 
       'defaults' => array(
        'controller' => 'Application\Controller\Index', 
        'action'  => 'index', 
       ), 
      ), 

Как вы знаете, безусловно, для http://localhost/application она будет прекрасно работать как home URL

, если я использую это:

'controllers' => array(
    'invokables' => array(
     'index' => 'Application\Controller\IndexController', 
    ), 
), 

как вы знаете конфигурации объединится, и у меня должен быть только один контроллер индекса в проекте.

Почему строка '__NAMESPACE__' => 'Application\Controller', игнорируется, и она ищет только индекс или индекс в массиве контроллеров, который не существует?

EDIT:

С по сравнению с другими проектами, которые я добавил это Application/Module.php:

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

и он работает сейчас, но мне нужно, и объяснение. это решение? Я хотел бы добавить это в один из Module.php файлов в проекте, чтобы правила маршрутизации работали нормально? и почему без него __NAMESPACE__ будет проигнорирован в правилах маршрутизации?

ответ

1

Вы уже нашли решение, указав при этом ModuleRouteListener. Объяснение можно найти в the description of the onRoute method inside this listener:

Прослушать событие «маршрут» и определить, должно ли пространство имен модулей быть добавлено к имени контроллера.

Если совпадение маршрута содержит ключ параметра, соответствующий константе MODULE_NAMESPACE, это значение будет добавлено с разделителем пространства имен к параметру согласованного контроллера.

+0

Thx, поэтому __NAMESPACE__ не будет проверяться без использования ModuleRouteListener? –

+0

@ S.Голизаде Точно – Wilt

Смежные вопросы