[英]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”作为可调用键,但它没有帮助。
我使用这种配置变体解决了这个问题(我希望它对某些人有用):
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.