我是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( '/郎/翻译'); 两个模块都能正常工作。
答案 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'))
您可能也应该为子路由定义默认操作。虽然我不记得如果没有指定动作,路由器是否会默认索引。