ZF2路由器配置

时间:2013-08-19 17:39:13

标签: zend-framework2 router zend-config

我是ZF2的新手,但我尝试编写一个应用程序。我遇到了invokables和路由配置的问题。

我有两个配置模块:

<?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'
                )
            )
        )
    )
)

<?php
return array(
'controllers' => array(
    'invokables' => array(
        'Admin' => 'Lang\Controller\AdminController'
        ,'Translation' => 'Lang\Controller\TranslationController'
    )
)
,'router' => array(
    'routes' => array(
        'lang' => array(
            'type' => 'segment'
            ,'options' => array(
                'route' => '/lang[/:controller][/:action]'
                ,'constraints' => array(
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]*'
                    ,'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
                )
                ,'defaults' => array(
                    'controller' => 'Admin'
                    ,'action' => 'index'
                )
            )
        )
    )
)

但是在页面/词汇/管理员上我看到了page / lang / admin的内容。看来,问题是可调用数组的键“Admin”是相同的。 如何修改配置以使应用程序正常工作?我想保留“lang / admin”和“词汇/管理”路径。

我尝试使用“Vocabulary \ Controller \ Admin”而不是“Admin”作为可调用键,但它没有帮助。

更新

我使用这种配置变体解决了这个问题(我希望它对某些人有用):

return array(
'controllers' => array(
    'invokables' => array(
        'Lang\Controller\Admin' => 'Lang\Controller\AdminController'
        ,'Lang\Controller\Translation' => 'Lang\Controller\TranslationController'
    )
)
,'router' => array(
    'routes' => array(
        'lang' => array(
            'type' => 'Literal'
            ,'options' => array(
                'route' => '/lang'
                ,'defaults' => array(
                    '__NAMESPACE__' => 'Lang\Controller',
                    'controller' => 'Lang\Controller\Admin'
                    ,'action' => 'index'
                )
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller][/:action]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        )
    )
)

在这种情况下,视图助手命令$ this-&gt; url('lang',array('controller'=&gt;'translation'))仅返回“lang /”,但我使用$ this-&gt; serverUrl( '/郎/翻译'); 两个模块都能正常工作。

2 个答案:

答案 0 :(得分:2)

您可以使用完整名称空间定义您的invokable和路由,如

'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'

    )
)

然后调整每个路由部分的defaults密钥以使新密钥具有完整的命名空间。即。

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

包含完整的命名空间是个人偏好,因为它使我的代码所指向的位置更加清晰。您不必这样做,但控制器的invokable不能重复,因为此配置合并到一个大的配置数组中,最后一个定义获胜。因此,您对Admin的可调用密钥Lang\Controller\AdminController的定义会将您之前对该密钥的分配覆盖为Vocabulary\Controller\AdminController

答案 1 :(得分:1)

回答问题的最后部分(因为我同意@ChanlderTi的第一部分):

  

在这种情况下,视图助手命令$ this-&gt; url('lang',array('controller'=&gt;'translation'))仅返回“lang /”

这是因为“lang”路线是仅定义“lang /”的文字。您要做的是定义子路由的URL,其完整路由名称为“lang / default”。所以你的代码应该是:

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

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