我在ZF3中,使用zend-mvc-skeleton并尝试配置一个通用路由,该路由将匹配尽可能多的URL,因为我希望能够创建新的控制器(当然包括操作方法),以及让它们立即可用。
文档中描述的常用方法是编写与控制器和操作匹配的路径(与ZF2相同)。
这是我的http://localhost/application
indexAction()
它就像IndexController
和/module/Application/src/IndexController.php
调用fooAction()
文件中http://localhost/application/foo
类A 404 error occurred
Page not found.
The requested controller could not be mapped to an existing controller class.
Controller:
foo (resolves to invalid controller class or alias: foo)
No Exception available
函数的魅力一样。
但是,当我尝试在同一个Controller(即IndexController)中获取http://localhost/bar/foo
函数时,它无效。它无法正确解析fooAction()
。我收到以下错误:
barController
如果我尝试{{1}}获取{{1}}中的{{1}},则会出现同样的错误。
你知道这有什么问题吗?任何帮助将不胜感激。非常感谢。
答案 0 :(得分:2)
路由http://localhost/application/foo
不会在索引控制器中解析为fooAction()
,因为URL中的/foo
将与控制器匹配而不是操作。使用该路线设置,您需要访问http://localhost/application/index/foo
。
为了让它正常工作,您还需要确保在配置中将控制器别名,例如:假设你有:
'controllers' => [
'invokables' => [
'Application\Controller\Index' => \Application\Controller\IndexController::class
]
],
然后为控制器设置别名,使其与路径参数匹配:
'controllers' => [
'invokables' => [
'Application\Controller\Index' => \Application\Controller\IndexController::class
],
'aliases' => [
'index' => 'Application\Controller\Index'
]
],
您需要为每个未使用路径所需字符串注册的控制器添加与路由参数匹配的别名,例如:控制器Namespace\Controller\BarController
应该别名为bar
等。
答案 1 :(得分:0)
我带着类似的问题来到这里。我已经创建了两个控制器 “应用程序”模块,以及两个新模块“Account”中的同名。
Application/Controller/IndexController
Application/Controller/OverviewController
Account/Controller/IndexController
Account/Controller/OverviewController
这是我的modules.config.php
模块/帐户/配置/ module.config.php
return [ 'router' => [ 'routes' => [ 'Account-account' => [ 'type' => Segment::class, 'options' => [ 'route' => '/account[/][:controller[/][:action][/]]', 'defaults' => [ '__NAMESPACE__' => 'Account\Controller', 'controller' => Account\Controller\IndexController::class, 'action' => 'index', 'locale' => 'en_us' ], ], 'may_terminate' => true, 'child_routes' => [ 'wildcard' => [ 'type' => 'Wildcard' ], ], ], ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => AccountControllerFactory::class, Controller\OverviewController::class => AccountControllerFactory::class, ], 'aliases' => [ 'index' => IndexController::class, 'overview' => OverviewController::class ] ],
和我的 模块/应用/配置/ module.config.php
return [
'router' => [
'routes' => [
'home' => [
'type' => Literal::class,
'options' => [
'route' => '/',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
'Application-application' => [
'type' => Segment::class,
'options' => [
'route' => '/application[/][:controller[/][:action][/]]',
'defaults' => [
'__NAMESPACE__' => 'Application\Controller',
'controller' => Application\Controller\IndexController::class,
'action' => 'index',
'locale' => 'en_US'
],
],
'may_terminate' => true,
'child_routes' => [
'wildcard' => [
'type' => 'Wildcard'
],
],
],
],
],
'controllers' => [
'factories' => [
Controller\IndexController::class => IndexControllerFactory::class,
Controller\OverviewController::class => IndexControllerFactory::class,
],
'aliases' => [
'index' => IndexController::class,
'overview' => OverviewController::class,
]
],
使用此配置,如果注释了别名部分,则会显示一条错误消息,指出存在无效的控制器或别名(索引/概述)。 如果有别名 route:“application / overview / index”进入Account模块。