Zend framework2 ZF2路由器配置

Zend framework2 ZF2路由器配置,zend-framework2,router,zend-config,Zend Framework2,Router,Zend Config,我是ZF2的新手,但我尝试编写一个应用程序。我面临着可调用和路由配置的问题 我有2个配置模块: <?php return array( 'controllers' => array( 'invokables' => array( 'Index' => 'Vocabulary\Controller\IndexController' ,'Add' => 'Vocabulary\Controller\AddController'

我是ZF2的新手,但我尝试编写一个应用程序。我面临着可调用和路由配置的问题

我有2个配置模块:

<?php
return array(
'controllers' => array(
    'invokables' => array(
        'Index' => 'Vocabulary\Controller\IndexController'
        ,'Add' => 'Vocabulary\Controller\AddController'
        ,'Admin' => 'Vocabulary\Controller\AdminController'
    )
)
,'router' => array(
    'routes' => array(
        'vocabulary' => array(
            'type' => 'segment'
            ,'options' => array(
                'route' => '/vocabulary[/:controller][/:action]'
                ,'constraints' => array(
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]*'
                    ,'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
                )
                ,'defaults' => array(
                    'controller' => 'Index'
                    ,'action' => 'index'
                )
            )
        )
    )
)
在本例中,view helper命令$this->url('lang',array('controller'=>'translation'))只返回“lang/”,但我使用$this->serverUrl('/lang/translation');
这两个模块都能正常工作。

您只需使用完整名称空间定义可调用项和路由,如中所示

'controllers' => array(
    'invokables' => array(
        'Vocabulary\Controller\Index' => 'Vocabulary\Controller\IndexController'
        ,'Vocabulary\Controller\Add' => 'Vocabulary\Controller\AddController'
        ,'Vocabulary\Controller\Admin' => 'Vocabulary\Controller\AdminController'
    )
)

'controllers' => array(
    'invokables' => array(
         'Lang\Controller\Admin' => 'Lang\Controller\AdminController'
         ,'Lang\Controller\Translation' => 'Lang\Controller\TranslationController'

    )
)
然后调整每个路由部分的
默认值
键,使新键具有完整的命名空间。i、 e

'defaults' => array(
    'controller' => 'Lang\Controller\Admin'
     ,'action' => 'index'
)

包含完整的名称空间是我个人的偏好,因为它使我更清楚地知道代码指向哪里。您不必这样做,但控制器的可调用项无法复制,因为此配置已合并到一个大型配置数组中,并定义了最后一个配置数组。因此,您将可调用键
Admin
定义为
Lang\Controller\AdminController
覆盖了您先前将该键分配给
词汇表\Controller\AdminController

来回答问题的最后一部分(我同意@ChanlderTi在第一部分的观点):

在这种情况下,视图帮助器命令$this->url('lang',array('controller'=>'translation'))只返回“lang/”

这是因为“lang”路由是一个仅定义“lang/”的文本。您试图做的是定义子路由的url,其完整路由名称为“lang/default”。因此,您的代码应该是:

$this->url('lang/default', array('controller' => 'translation'))

您可能还应该为子路由定义默认操作。虽然我不记得如果没有指定任何操作,路由器是否会默认为索引。

在将密钥更改为“词汇表\控制器\管理员”后,能否显示新配置?在问题的最后一行,OP已经说密钥已更改为包含命名空间。感谢您的回答!我已经尝试按照您的建议更改配置。在这种情况下,默认页面一切正常。但当我尝试使用非默认控制器(例如lang/translation或词汇表/add)访问页面时,我得到404错误。需要明确的是,错误消息是“请求的控制器无法映射到现有控制器类。控制器:添加(解析为无效的控制器类或别名:添加)”系统需要根据路由器约束数组定义“添加”控制器。它搜索“添加”可调用键,但不搜索“词汇表\控制器\添加”。谢谢!它起作用了。此外,我尝试不设置任何操作,路由器将“索引”设置为默认值。
'defaults' => array(
    'controller' => 'Lang\Controller\Admin'
     ,'action' => 'index'
)
$this->url('lang/default', array('controller' => 'translation'))