2012-05-03 4 views
1

У меня есть это как часть моей DI конфигурации, от скелета applicaiton:Как выбрать пространство имен контроллера с помощью маршрутизации Zend Framework 2?

   '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(
           'controller' => 'Application\Controller\IndexController', 
           'action'  => 'index', 
          ), 
         ), 
        ), 

Я хотел бы сделать следующую маршрутизацию:

http://me.com/mycontroller/myaction --> 
controller=Applicaiton\Controller\Mycontroller 
method=myactionAction 

Однако выше конфигурация производит:

http://me.com/mycontroller/myaction --> 
controller=Mycontroller 
method=myactionAction 

Как вы можете видеть, пространство имен для контроллера отсутствует. Где/как разместить пространство имен? (Я знаю, что я мог бы сделать псевдоним DI для каждого контроллера, но это обезопасит цель согласования сегмента.)

+0

согласование сегментов возможно для действий и других параметров, но не для контроллеров. Вы можете использовать псевдонимы, чтобы помочь 'mycontroller' соответствовать' MyNamespace \ Mycontroller', но это не рекомендуется. Самый лучший, самый простой и наиболее эффективный способ - иметь маршруты для каждого контроллера, при необходимости использовать сегменты для действий. –

+0

Хорошо. Имеет смысл. Если вы напишете свой ответ ниже, я приму его. – superdweebie

ответ

1

Вы не должны использовать сегменты для контроллеров на своих маршрутах. Согласование по сегментам возможно для действий и других параметров, но не для контроллеров. Вы можете использовать псевдонимы, чтобы помочь mycontroller соответствовать MyNamespace \ Mycontroller, но это не рекомендуется. Самый лучший, самый простой и наиболее эффективный способ - иметь маршруты для каждого контроллера, при необходимости использовать сегменты для действий.

2

Совершенно возможно достичь того, чего вы изначально пытались достичь. В настройках по умолчанию вы могли бы добавить ключ __NAMESPACE__ и слегка изменить ключ контроллера.

Вы могли бы сделать это:

'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(
      '__NAMESPACE__' => 'Application\Controller', 
      'controller' => 'Index', 
      'action' => 'index', 
     ), 
    ), 
), 

Единственное изменение, которые будут необходимы, когда вы регистрируете ваш контроллер в качестве invokable в конфигурации модуля вы должны сделать это так:

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

Обратите внимание на то, как я использовал Index в ключе вместо IndexController.

Этот ключ __NAMESPACE__ по умолчанию для определения маршрута и удаление «Контроллера» в конце ключа в поведении массива invokables не упоминается нигде в документации, которую я мог бы оценить. Я на самом деле почерпнуть эту информацию от того, как работает маршрутизация в ZendSkeletionApplication:

https://github.com/zendframework/ZendSkeletonApplication/blob/master/module/Application/config/module.config.php