zf2 路由似乎忽略了 __NAMESPACE__

zf2 routing seems to ignore __NAMESPACE__

在 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 未找到错误:

The requested controller could not be mapped to an existing controller class.

Controller: User(resolves to invalid controller class or alias: User)

这几乎就像路由器完全忽略 '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,但我无法在实践中使用它。该示例是否错误且已过时?

要使其按预期工作,您必须将 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 上查看更多详细信息。他们在那里写道:

This listener determines if the module namespace should be prepended to the controller name. This is the case if the route match contains a parameter key matching the MODULE_NAMESPACE constant.