2015-02-21 3 views
2

Теперь я пытаюсь работать с Zend Framework 2 и имею некоторые проблемы с маршрутизацией. У меня есть навигация, как это:Zend Framework 2 Маршрутизация динамически

Home 
Current 
    News 
    Schedule 
Club 
    History 
    Management 
    Referee 
    Restaurant 
Team 
    First 
     Table 
     Squad 
    Second 
     Table 
     Squad 
    Old 
     Table 
     Squad 
    Djunior 
     Table 
     Squad 
    Efjunior 
     Table 
     Squad 
    National 
     Table 
     Squad 
    Utility 
     Table 
     Squad 
Sponsor 
About 
    Approach 
    Contact 
    Disclaimer 
    Imprint 

Мой module.config.php как это:

return array(
    'router' => array(
     'routes' => array(
      //Literal-Route: Home 
      //Controller: IndexController 
      //View: index/index.phtml 
      'home' => array(
       'type' => 'Zend\Mvc\Router\Http\Literal', 
       'options' => array(
        'route' => '/', 
        'defaults' => array(
         'controller' => 'Football\Controller\Index', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
      //Segment-Route: football 
      'football' => array(
       'type' => '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__' => 'Football\Controller', 
         'controller' => 'index', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
      'subteam' => array(
       'type' => 'segment', 
       'options' => array(
        'route' => '[/:controller[[/first]/:action]]', 
        'constraints' => array(
         'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
        ), 
        'defaults' => array(
         '__NAMESPACE__' => 'Football\Controller', 
         'controller' => 'index', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'Football\Controller\Index' => 'Football\Controller\IndexController', 
      'Football\Controller\Current' => 'Football\Controller\CurrentController', 
      'Football\Controller\About' => 'Football\Controller\AboutController', 
      'Football\Controller\Sponsor' => 'Football\Controller\SponsorController', 
      'Football\Controller\Club' => 'Football\Controller\ClubController', 
      'Football\Controller\Team' => 'Football\Controller\TeamController', 
     ), 
    ), 
    'service_manager' => array(
     'factories' => array(
      'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory', 
      'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
     ), 
    ), 
    'translator' => array(
     'locale' => 'en_US', 
     'translation_file_patterns' => array(
      array(
       'type'  => 'gettext', 
       'base_dir' => __DIR__ . '/../language', 
       'pattern' => '%s.mo', 
      ), 
     ), 
    ), 
    'navigation' => array(
     'default' => array(
      //localhost 
      array(
       'label' => 'Home', 
       'route' => 'home', 
      ), 
      //localhost/current 
      'current' => array(
       'type'  => 'mvc', 
       'order'  => '100', 
       'label'  => 'Aktuelles', 
       'route'  => 'football', 
       'controller' => 'current', 
       'action'  => 'index', 
       'pages' => array(
        //localhost/current/news 
        'news' => array(
         'type'  => 'mvc', 
         'order'  => '100', 
         'label'  => 'Nachrichten', 
         'route'  => 'football', 
         'controller' => 'current', 
         'action'  => 'news', 
        ), 
        //localhost/current/schedule 
        'schedule' => array(
         'type'  => 'mvc', 
         'order'  => '200', 
         'label'  => 'Trainingszeiten', 
         'route'  => 'football', 
         'controller' => 'current', 
         'action'  => 'schedule', 
        ), 
       ), 
      ), 
      //localhost/club 
      'club' => array(
       'type'  => 'mvc', 
       'order'  => '200', 
       'label'  => 'Verein', 
       'route'  => 'football', 
       'controller' => 'club', 
       'action'  => 'index', 
       'pages' => array(
       //localhost/club/history 
        'history' => array(
         'type'  => 'mvc', 
         'order'  => '100', 
         'label'  => 'Geschichte', 
         'route'  => 'football', 
         'controller' => 'club', 
         'action'  => 'history', 
        ), 
        //localhost/club/management 
        'management' => array(
         'type'  => 'mvc', 
         'order'  => '200', 
         'label'  => 'Vorstand', 
         'route'  => 'football', 
         'controller' => 'club', 
         'action'  => 'management', 
        ), 
        //localhost/club/referee 
        'referee' => array(
         'type'  => 'mvc', 
         'order'  => '300', 
         'label'  => 'Schiedsrichter', 
         'route'  => 'football', 
         'controller' => 'club', 
         'action'  => 'referee', 
        ), 
        //localhost/club/restaurant 
        'restaurant' => array(
         'type'  => 'mvc', 
         'order'  => '400', 
         'label'  => 'Gaststätte', 
         'route'  => 'football', 
         'controller' => 'club', 
         'action'  => 'restaurant', 
        ), 
       ), 
      ), 
      //localhost/team 
      'team' => array(
       'type'  => 'mvc', 
       'order'  => '300', 
       'label'  => 'Mannschaften', 
       'route'  => 'football', 
       'controller' => 'team', 
       'action'  => 'index', 
       'pages' => array(
       //localhost/team/first 
        'first' => array(
         'type'  => 'mvc', 
         'order'  => '100', 
         'label'  => '1. Herren', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'first', 
         'pages' => array(
          //localhost/team/first/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/first/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
        //localhost/team/second 
        'second' => array(
         'type'  => 'mvc', 
         'order'  => '200', 
         'label'  => '2. Herren', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'second', 
         'pages' => array(
          //localhost/team/second/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/second/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
        //localhost/team/old 
        'old' => array(
         'type'  => 'mvc', 
         'order'  => '300', 
         'label'  => 'Alte Herren', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'old', 
         'pages' => array(
          //localhost/team/old/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/old/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
        //localhost/team/djunior 
        'djunior' => array(
         'type'  => 'mvc', 
         'order'  => '400', 
         'label'  => 'D-Junioren', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'djunior', 
         'pages' => array(
          //localhost/team/djunior/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/djunior/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
        //localhost/team/efjunior 
        'efjunior' => array(
         'type'  => 'mvc', 
         'order'  => '500', 
         'label'  => 'E/F-Junioren', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'efjunior', 
         'pages' => array(
          //localhost/team/efjunior/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/efjunior/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
        //localhost/team/national/ 
        'national' => array(
         'type'  => 'mvc', 
         'order'  => '600', 
         'label'  => 'Volkssport', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'national', 
         'pages' => array(
          //localhost/team/national/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/national/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
        //localhost/team/utility/ 
        'utility' => array(
         'type'  => 'mvc', 
         'order'  => '700', 
         'label'  => 'Stadtwerke', 
         'route'  => 'football', 
         'controller' => 'team', 
         'action'  => 'utility', 
         'pages' => array(
          //localhost/team/utility/table 
          'table' => array(
           'type'  => 'mvc', 
           'order'  => '100', 
           'label'  => 'Tabelle', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'table', 
          ), 
          //localhost/team/utility/squad 
          'squad' => array(
           'type'  => 'mvc', 
           'order'  => '200', 
           'label'  => 'Mannschaftskader', 
           'route'  => 'subteam', 
           'controller' => 'team', 
           'action'  => 'squad', 
          ), 
         ), 
        ), 
       ), 
      ), 
      //localhost/sponsor 
      'sponsor' => array(
       'type'  => 'mvc', 
       'order'  => '400', 
       'label'  => 'Sponsoren', 
       'route'  => 'football', 
       'controller' => 'sponsor', 
       'action'  => 'index', 
      ), 
      //localhost/about 
      'about' => array(
       'type'  => 'mvc', 
       'order'  => '500', 
       'label'  => 'Über uns', 
       'route'  => 'football', 
       'controller' => 'about', 
       'action'  => 'index', 
       'pages' => array(
        //localhost/about/approach 
        'approach' => array(
         'type'  => 'mvc', 
         'order'  => '100', 
         'label'  => 'Anfahrt', 
         'route'  => 'football', 
         'controller' => 'about', 
         'action'  => 'approach', 
        ), 
        //localhost/about/contact 
        'contact' => array(
         'type'  => 'mvc', 
         'order'  => '200', 
         'label'  => 'Kontakt', 
         'route'  => 'football', 
         'controller' => 'about', 
         'action'  => 'contact', 
        ), 
        //localhost/about/disclaimer 
        'disclaimer' => array(
         'type'  => 'mvc', 
         'order'  => '300', 
         'label'  => 'Disclaimer', 
         'route'  => 'football', 
         'controller' => 'about', 
         'action'  => 'disclaimer', 
        ), 
        //localhost/about/imprint 
        'imprint' => array(
         'type'  => 'mvc', 
         'order'  => '400', 
         'label'  => 'Impressum', 
         'route'  => 'football', 
         'controller' => 'about', 
         'action'  => 'imprint', 
        ), 
       ), 
      ), 
     ), 
    ),            
    'view_manager' => array(
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'doctype'     => 'HTML5', 
     'not_found_template'  => 'error/404', 
     'exception_template'  => 'error/index', 
     'template_map' => array(
      'layout/layout'  => __DIR__ . '/../view/layout/layout.phtml', 
      'layout/header'  => __DIR__ . '/../view/layout/header.phtml', 
      'layout/sidebar'  => __DIR__ . '/../view/layout/sidebar.phtml', 
      'layout/footer'  => __DIR__ . '/../view/layout/footer.phtml', 
      'football/index/index' => __DIR__ . '/../view/football/index/index.phtml', 
      'error/404'   => __DIR__ . '/../view/error/404.phtml', 
      'error/index'   => __DIR__ . '/../view/error/index.phtml', 
     ), 
     'template_path_stack' => array(
      __DIR__ . '/../view', 
     ), 
    ), 
); 

Я думаю, что моя проблема сейчас subteam-маршрут, потому что это статический поэтому, когда я нажимаю, например, на Team-> Second-> Table маршрут будет «Team-> First-> Table». Неважно, какая команда я нажимаю на эту «первую» часть, всегда есть, и я не знаю, как я делаю ее динамически. Надеюсь, это понятно для вас, ребята, и кто-то может объяснить мне, как сделать эти командные маршруты динамически. :)

Редактировать: Я обновил module.config.php, теперь вы видите весь файл.

AboutController.php

namespace Football\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class AboutController extends AbstractActionController 
{ 
public function indexAction() 
{ 
    return new ViewModel(); 
} 

public function contactAction() 
{ 
    return new ViewModel(); 
} 

public function approachAction() 
{ 
    return new ViewModel(); 
} 

public function disclaimerAction() 
{ 
    return new ViewModel(); 
} 

public function imprintAction() 
{ 
    return new ViewModel(); 
} 

ClubController.php

namespace Football\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class ClubController extends AbstractActionController 
{ 
public function indexAction() 
{ 
    return new ViewModel(); 
} 

public function historyAction() 
{ 
    return new ViewModel(); 
} 

public function managementAction() 
{ 
    return new ViewModel(); 
} 

public function refereeAction() 
{ 
    return new ViewModel(); 
} 

public function restaurantAction() 
{ 
    return new ViewModel(); 
} 

CurrentController.php

namespace Football\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class CurrentController extends AbstractActionController 
{ 
public function indexAction() 
{ 
    return new ViewModel(); 
} 

public function newsAction() 
{ 
    return new ViewModel(); 
} 

public function scheduleAction() 
{ 
    return new ViewModel(); 
} 

IndexController.php

namespace Football\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController 
{ 
public function indexAction() 
{ 
    return new ViewModel(); 
} 

public function clubAction() 
{ 
    return new ViewModel(); 
} 

public function contactAction() 
{ 
    return new ViewModel(); 
} 

public function currentAction() 
{ 
    return new ViewModel(); 
} 

public function teamAction() 
{ 
    return new ViewModel(); 
} 

public function sponsorAction() 
{ 
    return new ViewModel(); 
} 

public function approachAction() 
{ 
    return new ViewModel(); 
} 

public function imprintAction() 
{ 
    return new ViewModel(); 
} 

SponsorController.php

namespace Football\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class SponsorController extends AbstractActionController 
{ 
public function indexAction() 
{ 
    //DatenbankAdapter holen 
    $db = $this->getServiceLocator()->get('db'); 

    return new ViewModel(array('db' => $db)); 
} 

TeamController.php

namespace Football\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class TeamController extends AbstractActionController 
{ 
public function indexAction() 
{ 
    return new ViewModel(); 
} 

public function firstAction() 
{ 
    return new ViewModel(); 
} 

public function tableAction() 
{ 
    return new ViewModel(); 
} 

public function squadAction() 
{ 
    return new ViewModel(); 
} 

public function secondAction() 
{ 
    return new ViewModel(); 
} 

public function oldAction() 
{ 
    return new ViewModel(); 
} 

public function djuniorAction() 
{ 
    return new ViewModel(); 
} 

public function efjuniorAction() 
{ 
    return new ViewModel(); 
} 

public function nationalAction() 
{ 
    return new ViewModel(); 
} 

public function utilityAction() 
{ 
    return new ViewModel(); 
} 
+0

Никто не имеет идеи/советы/решение моей проблемы? –

+0

Мне немного сложно следить за тем, что вы пытаетесь сделать. Не могли бы вы представить список своих контроллеров с действиями и как они должны соответствовать структуре навигации, которую вы предоставили? Маршруты, которые у вас там есть, настолько универсальны, что трудно сказать, что делать с картой. – guessimtoolate

+0

Я добавил полный файл module.config.php и мои контроллеры, надеюсь, что это то, что вам нужно. Возможно, я снова скажу проблему: я пытаюсь добраться, например. эта ссылка home-> team-> second-> table, но когда я перейду на сайт, я получу home-> team-> first-> table. Поэтому я получаю неправильную таблицу от неправильной команды. Я думаю, что проблема заключается в маршруте «subteam», но я не знаю, как его решить. –

ответ

0

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

  • ребенка маршруты для table и squad действия
  • или добавить третий, необязательный, пункт m, который будет содержать значение table|squad , проведите маршрут к действиям для типов команд и добавьте там условие. Смотрите пример ниже

конфигурации:

// ... 
'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Literal', 
      'may_terminate' => true, 
      'options' => array(
       'route' => '/', 
       'defaults' => array(
        'controller' => 'Football\Controller\Index', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
     'football' => array(
      'type' => 'segment', 
      'may_terminate' => true, 
      'options' => array(
       'route' => '/:controller[/:action[/:extra]]', 
       'constraints' => array(
        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
        'extra' => '(squad|table)', 
       ), 
       'defaults' => array(
        'controller' => 'Football\Controller\Index', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
    ), 
), 

Что касается навигации:

// ... 
'pages' => array(
    'first' => array(
     'type'  => 'mvc', 
     'order'  => '100', 
     'label'  => '1. Herren', 
     'route'  => 'football', 
     'controller' => 'team', 
     'action'  => 'first', 
     'pages' => array(
      'table' => array(
       'type'  => 'mvc', 
       'order'  => '100', 
       'label'  => 'Tabelle', 
       'route'  => 'football', 
       'params' => array(
        'extra' => 'table', 
       ), 
       'controller' => 'team', 
       'action'  => 'table', 
      ), 
      'squad' => array(
       'type'  => 'mvc', 
       'order'  => '200', 
       'label'  => 'Mannschaftskader', 
       'route'  => 'football', 
       'params' => array(
        'extra' => 'squad', 
       ), 
       'controller' => 'team', 
       'action'  => 'squad', 
      ), 
     ), 
    ), 
+0

Спасибо, что ответили, но он не работает. Когда я хочу перейти в '/ team/first/table', я прихожу на'/team/table/table'. Я думаю, что что-то в основном не соответствует моей маршрутизации: / –

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