我在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)
由此我得出结论,整个子路由它不起作用,而不仅仅是默认/回退选项。为什么儿童路线从未匹配?
答案 0 :(得分:2)
您得到的错误表明Zend路由器无法将控制器b
映射到现有类。它需要知道应用程序中控制器类的位置。
可能的解决方案是在invokables
文件的module.config
内将控制器的名称设为别名。例如:'a' => 'Test\Controller\AController'
为AController
。路由/a
已匹配,并且不会因为您在路由配置中设置默认控制器而引发错误。
因此您只需更改代码的这一部分即可。这样,将使用key value
数组中的invokables
调用控制器:
'controllers' => array(
'invokables' => array(
'a' => 'Test\Controller\AController',
'b' => 'Test\Controller\BController',
'c' => 'Test\Controller\CController',
),
),
另一种解决方案是在路由配置中添加__NAMESPACE__
个控制器,这样就可以保留现有的别名。
只需像这样修改你的代码:
'router' => array(
'routes' => array(
'some-test' => array(
'type' => 'literal',
'options' => array(
'route' => '/a',
'defaults' => array(
'__NAMESPACE__' => 'Test\Controller',//<---add it here
'controller' => 'Test\Controller\A',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'segment',
'options' => array(
'route' => '[/:controller[/:action]]',
'defaults' => array(
'action' => 'index',
),
),
),
),
),
),
),