【发布时间】:2015-04-23 03:47:14
【问题描述】:
我现在在 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',
),
),
);
我认为我现在的问题是子团队路线,因为它是静态的,所以当我点击例如在 Team->Second->Table 上,路线将是“Team->First->Table”。不管我点击哪个团队,这个“第一”部分总是在那里,我不知道我是如何动态地制作它的。希望这对你们来说是可以理解的,并且有人可以向我清楚地解释如何动态地制作这些团队路线。 :)
编辑:我更新了module.config.php,你现在可以看到整个文件了。
关于控制器.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));
}
团队控制器.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();
}
【问题讨论】:
-
没有人对我的问题有想法/建议/解决方案?
-
我有点难以理解你想要做的事情。您能否提供一个包含操作的控制器列表以及它们应该如何与您提供的导航结构相对应?您在那里的路线是如此普遍,以至于很难说出应该映射到哪里。
-
我添加了完整的 module.config.php 文件和我的控制器,希望这是您需要的。也许我会再次告诉这个问题:我正在尝试达到例如这个链接 home->team->second->table,但是当我导航到该站点时,我会得到 home->team->first->table。所以我从错误的团队那里得到了错误的桌子。我认为问题是路线“子团队”,但我不知道如何解决。
-
好的,这样更好。但是
table和squad部分应该如何工作?TeamController中只有一个,但导航中有多个。那么/team/first/table/和/team/second/table是否应该分派到相同的操作,并且您会以某种方式区分它们? -
是的,我认为这些链接将全部集中到一个动作中,并显示带有一些 if-else 的单击团队的表格,对于小队也是如此。我应该尝试另一种方式来实现这一点,还是您对此有何看法?我的另一个问题是如何解决这个 /team/first/table/ 和 /team/second/table。
标签: php zend-framework frameworks zend-framework2