zf2路由似乎忽略__NAMESPACE__

时间:2017-01-19 08:59:41

标签: php routing namespaces zend-framework2 zend-framework-mvc

在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,但我无法在实践中使用它。示例是错误的还是过时的?

1 个答案:

答案 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常量匹配的参数键,则会出现这种情况。