【发布时间】:2015-04-18 22:58:16
【问题描述】:
Zend Framework 2 中我的模块的module.config.php 如下所示:
return array(
'controllers' => array(
'invokables' => array(
'Test\Controller\A' => 'Test\Controller\AController',
'Test\Controller\B' => 'Test\Controller\BController',
'Test\Controller\C' => 'Test\Controller\CController',
),
),
'router' => array(
'routes' => array(
'some-test' => array(
'type' => 'literal',
'options' => array(
'route' => '/a',
'defaults' => array(
'controller' => 'Test\Controller\A',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'some-other-test' => array(
'type' => 'segment',
'options' => array(
'route' => '[/:controller[/:action]]',
'defaults' => array(
'action' => 'index',
),
),
),
),
),
),
),
'view_manager' => array(
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
);
文字路由有效,/a 正确匹配,而/a/ 导致 404,这很好且合乎逻辑。
使用分段路线,情况看起来有点不同。无论我输入什么,路线都从不匹配。所以路由/a/b 失败了,我不明白。
根据上面的子路由设置,尾部斜杠是可选的,但是当它在那里时,还需要指定控制器名称。如果是这种情况,则应调用指定控制器的索引操作 - 在此示例中来自 BController。
如果在控制器名称后添加斜杠,则需要指定操作。
即使我输入/a/b/index,我也会收到 404 错误:
The requested controller could not be mapped to an existing controller class.
Controller:
b(resolves to invalid controller class or alias: b)
由此我得出结论,整个子路由它不起作用,而不仅仅是默认/后备选项。为什么子路由永远不匹配?
【问题讨论】:
-
我怀疑可选部分可能会导致匹配失败
'route' => '[/:controller[/:action]]',->'route' => '/:controller[/:action]', -
您确定在
/a/b上没有收到无效控制器错误吗? -
@Xerkus 我刚试过你的路线,它也不起作用。我不确定什么是无效的控制器错误,但我得到的错误实际上只是我的问题中的一个。
-
/a/b/index的错误表明您的路线有效。因此,如果您没有收到与/a/b相同的错误,那么会发生一些奇怪的事情 -
您可以在
invokables中更改控制器的别名,如下所示:'a' => 'Test\Controller\AController', 'b' => 'Test\Controller\BController', 'c' => 'Test\Controller\CController',。我认为它会工作
标签: php zend-framework2