在Zend Framework 2中,我尝试使用以下路线:
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/:username[/:action]',
'defaults' => array(
'__NAMESPACE__' => 'Website\Controller',
'controller' => 'User',
'action' => 'index',
),
),
'may_terminate' => true,
),
但是,当转到http://www.example.com/MyUsernameHere
时,我收到404
未找到错误:
请求的控制器无法映射到现有的控制器类。
控制器: 用户(解析为无效的控制器类或别名:用户)
它几乎就像路由器完全忽略了'Website\Controller'
命名空间,并在前面没有命名空间的情况下查找User
。
所以,如果我像这样手动输入命名空间:
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/:username[/:action]',
'defaults' => array(
'controller' => 'Website\Controller\User',
'action' => 'index',
),
),
'may_terminate' => true,
),
然后页面按预期加载。
是什么给出的? '__NAMESPACE__'
参数可以不用于控制器吗? ZF2网站显然使用'__NAMESPACE__'
example,但我无法在实践中使用它。示例是错误的还是过时的?
答案 0 :(得分:4)
为了使其按预期工作,您必须将ModuleRouteListener
附加到MVC事件管理器。您可以在模块onBootstrap
方法中执行此操作:
public function onBootstrap(MvcEvent $event)
{
//...
$application = $event->getApplication();
$eventManager = $application->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
//...
}
完成后,您的代码将按预期工作。
他们实际上应该在页面中提到您在问题中提到的示例。您可以查看有关模块路由侦听器here in the Zend\Mvc documentation的更多详细信息。他们在那里写道:
此侦听器确定是否应将模块命名空间添加到控制器名称之前。如果路由匹配包含与
MODULE_NAMESPACE
常量匹配的参数键,则会出现这种情况。