繁体   English   中英

Zend Framework 2动态路由

[英]Zend Framework 2 Routing dynamically

我现在正在尝试使用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-route,因为它是静态的,所以当我在例如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();
}

我认为您的主要问题是至少可以通过两种方法解决:

  • tablesquad行动的子路线
  • 或添加第三个可选参数,该参数将保留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',
            ),
        ),
    ),

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM