1

我是 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'
                )
            )
        )
    )
)

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

但是在 /vocabulary/admin 页面上,我看到 /lang/admin 页面的内容。看来,这个问题是可调用数组的键“Admin”是相等的。如何修改我的配置以使应用程序正常工作?我想保留“lang/admin”和“vocabulary/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->url('lang', array('controller' => 'translation')) 只返回“lang/”,但我使用 $this->serverUrl('/lang/translation' ); 两个模块都能正常工作。

4

2 回答 2

2

您可以使用完整的命名空间简单地定义您的可调用对象和路由,如

'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每个路由部分的密钥,以使新密钥具有完整的命名空间。IE

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

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

于 2013-08-19T19:07:21.090 回答
1

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

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

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

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

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

于 2013-08-21T03:12:45.253 回答