繁体   English   中英

ZF2路由器配置

[英]ZF2 router configuration

我是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”作为可调用键,但它没有帮助。

UPDATE

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

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-> url('lang',array('controller'=>'translation'))仅返回“lang /”,但我使用$ this-> serverUrl('/ lang / translation') ); 两个模块都能正常工作。

您可以使用完整的命名空间来定义您的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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM