2014-01-19 4 views
1

Предположим, у меня есть довольно стандартное определение маршрута, потому что, скажем, пользовательский материал:Несколько контроллеров на одном маршруте

'router' => array(
    'routes' => array(
     'user' => array(
      'type' => 'Zend\Mvc\Router\Http\Segment', 
      'options' => array(
       'route' => '/user[/:action]', 
       'constraints' => array('action' => '[a-zA-Z0-9_-]*'), 
       'defaults' => array(
        'controller' => 'usercontroller', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
    ), 
), 

Теперь предположим, что я хочу использовать различные контроллеры для различных групп действий «пользователь». Скажем, например, что одно или два действия («специальный» и «супер», скажем) должны перейти к «специальному контроллеру». Как это настроить? Я пробовал использовать «child_routes» безрезультатно, и я попытался иметь несколько «пользовательских» записей в массиве «routes», но без радости.

ответ

3

Вы можете создать тип маршрута буквальным, с сегментом ребенка типа маршрута:

'router' => array(
    'routes' => array(
     'user' => array(
      'type' => 'Literal', 
      'options' => array(
       'route' => '/user', 
       'defaults' => array(
        '__NAMESPACE__' => 'MyModule\Controller', 
        'controller' => 'User', 
        'action'  => 'index', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       'default' => array(
        'type' => 'Segment', 
        'options' => array(
         'route' => '/[:controller[/:action[/:id]]]', 
         'constraints' => array(
          'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
          'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
          'id'   => '[0-9]+', 
         ), 
         'defaults' => array(
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
), 

или, если вы предпочитаете, непосредственно объявить имя контроллера в качестве параметра маршрута в сегменте типа маршрута:

'router' => array(
    'routes' => array(
     'user' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/[:controller[/:action[/:id]]]', 
       'defaults' => array(
        '__NAMESPACE__' => 'MyModule\Controller', 
        'controller' => 'User', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
    ), 
), 

Я предпочитаю первый способ избежать конфликтов маршрута между контроллерами модулей

, что вы можете сделать, если у вас есть кратные контроллеры для определенной части йо ур-приложение (здесь: пользователи) и кратные разделы вашего приложения контролируются в том же модуле => организовать контроллеры в разных пространствах имен, как:

namespace MyModule\Controller\Users; 
1

Для тех, как я, который все еще учится ZF2 и предпочтет более простой вариант большой ответ на NonoHERON, вот код:

 'user' => array(
      'type' => 'Zend\Mvc\Router\Http\Literal', 
      'options' => array(
       'route' => '/user', 
       'defaults' => array(
        'controller' => 'usercontroller', 
        'action'  => 'index', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       'default' => array(
        'type' => 'Segment', 
        'options' => array(
         'route' => '/[:action]', 
         'constraints' => array('action' => '[a-zA-Z0-9_-]*'), 
         'defaults' => array(
          'controller' => 'usercontroller', 
          'action'  => 'index', 
         ), 
        ), 
       ), 
       'special' => array(
        'type' => 'Literal', 
        'options' => array(
         'route' => '/details', 
         'defaults' => array(
          'controller' => 'specialcontroller', 
          'action'  => 'special', 
         ), 
        ), 
       ), 
      ), 
     ), 

чтобы получить «$ this-> URL», чтобы работать с вашей точки зрения кода, теперь нужно настроить его немного по-другому. Для действий в группировке по умолчанию, она становится:

$this->url('user/default', array('action'=>'whatever')) 

Хотя для специальных, строго говоря, он должен быть:

$this->url('user/special') 

Однако, если все, что вы делаете изменения, которые контроллер действие идет до, затем

$this->url('user/default', array('action'=>'special')) 

также должен работать, чтобы получить правильную ссылку.

Существует также очень полезный чит-лист zf2 по адресу: http://zf2cheatsheet.com/