ZF2:儿童路线从未匹配 - 为什么?

时间:2015-04-17 21:16:07

标签: php zend-framework2

我在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)

由此我得出结论,整个子路由它不起作用,而不仅仅是默认/回退选项。为什么儿童路线从未匹配?

1 个答案:

答案 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',
                        ),
                    ),
                ),
            ),
        ),
    ),
),