2015-09-15 5 views
0

У меня установлено приложение SkeletonApplication и реализовано несколько контроллеров в стандартном модуле «Приложение».ZendFramework2 маршрутизация между модулями

Это хорошо работает.

Но теперь я хочу использовать второй модуль, и я хочу установить маршрут из модуля «Приложение» в новый модуль, чтобы связать его там в представлении.

Второй модуль называется «Sporttabs».

В моей application.config.php я поставил, как в документации:

// This should be an array of module namespaces used in the application. 
'modules' => array(
    'Application', 
    'Sporttabs' 

), 

В модуле 'Application' я установил в module.config.php:

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

     'fach' => array(
      'type' => 'segment', 
      'options' => array(
       'route' => '/index[/: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(
        'controller' => 'Index', 
        'action'  => 'index' 
       ), 
      ), 
     ), 

     'sporttabs' => array(
      'type' => 'segment', 
      'options' => array(
       'route' => '/sporttabs[/: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(
        'module' => 'Sporttabs', 
        'controller' => 'Sporttab', 
        'action'  => 'index' 
       ), 
      ), 
     ), 



    ), 

), 

I пытались связать его в index.phtml:

<a href="<?php echo $this->url('sporttabs',array('module' => 'sporttabs','controller' => 'sporttab','action' => 'index'))?>">Sporttabs-Projekt</a> 

Это не работает, я только получаю/sporttab

Даже если я пытаюсь сделать www.myurl.de/sporttabs, я не попадаю в модуль Sporttabs ... (Я использую ZendStudio для генерации модуля ne, поэтому я думаю, что все файлы находятся в правильном порядке позиция ...)

Можете ли вы дать мне подсказку, как это сделать?

+0

Подстановочные маршруты используются в приложении скелета как своего рода волшебство, поэтому новым пользователям не нужно определять каждый маршрут. Я предлагаю вам упростить свои ограничения и иметь более явные маршруты, чем это, особенно, чтобы узнать, как работает маршрутизация. – dualmon

ответ

0

Нет необходимости определять sporttabs внутри вашей конфигурации приложения. Я предлагаю вам сделать это в файле module.config.php Sporttabs.

Это пример моего маршрута /admin, который представляет собой другой модуль с именем Admin, который находится рядом с приложением.

'router' => [ 
     'routes' => [ 
      'admin' => [ 
       'type' => 'Literal', 
       'options' => [ 
        'route' => '/admin', 
        'defaults' => [ 
         '__NAMESPACE__' => 'Admin\Controller', 
         'controller' => 'Index', 
         'action'  => 'index', 
        ], 
       ], 
       'may_terminate' => true, 
       'child_routes' => [ 
        'default' => [ 
         'type' => 'Segment', 
         'options' => [ 
          'route' => '/[:controller[/][:action[/][:id][/page/:page][/search/:search]]]', 
          'constraints' => [ 
           'controller' => '[a-zA-Z0-9_-]*', 
           'action'  => '[a-zA-Z0-9_-]*', 
           'search'  => '[a-zA-Z0-9_-]*', 
           'id'   => '[0-9]+', 
           'page'  => '[0-9]+', 
          ], 
          'defaults' => [ 
           '__NAMESPACE__' => 'Admin\Controller', 
           'controller' => 'Index', 
           'action'  => 'index', 
          ], 
         ], 
        ], 
       ], 
      ], 
     ], 
    ], 

Оттуда я это сделать:

<?=$this->url("admin/default", ['controller' => "controler_name", "action" => "action_name_from_controller", "id" => id_or_something_else_if_needed])?> 

/default есть для того, чтобы иметь доступ к детям маршрутов.

0

@Stanimir ударяет правильный намек на мое решение:

При редактировании маршрутизации для моего приложения, я, должно быть, непреднамеренное изменение порядка массива маршрутов: «may_terminate» и «» child_routes раздел переместился на верхний уровень вместо того, чтобы быть частью маршрута «fach».

Так что я изменил массив следующим образом:

'routes'=> array(

     'fach'=> array(
      'type'  => 'Literal', 
      'options' => array(
       'route'  => '/', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        '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(
         '__NAMESPACE__' => 'Application\Controller', 
         'controller' => 'Index', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
     ), 
    ),), 

Как последействия включая пространство имен в маршрутизации, я также должен был изменить контроллеры массива, так как псевдоним контроллера изменен с " Index»к 'Application \ Controller \ Индекс':

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

    ), 
), 

Та же ошибка заблокировал меня от попадания во второй модуль, маршруты-массив был misordered тоже.

Теперь ссылка-решение Stanimir, опубликованное в его ответе, прекрасно работает, и я попадаю в свой новый модуль ...

Спасибо за помощь Станимир!