Zend2路由__NAMESPACE__不起作用或被忽略

时间:2016-08-14 12:44:38

标签: php zend-framework2 url-routing

我在Zend2中使用此配置作为我的应用程序模块配置,这是非常正常的,每个人都建议作为标准路由规则:

'controllers'  => array(
    'invokables' => array(
        'Application\Controller\Index'   => 'Application\Controller\IndexController',
    ),
),
'router'       => array(
    'routes' => array(
        'home' => array(
            'type' => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route'    => '/',
                'defaults' => array(
                    'controller' => 'Application\Controller\Index',
                    'action'     => 'index',
                ),
            ),
        ),
        'application' => array(
            'type'    => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route'    => '/application',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'default' => array(
                    'type'    => 'Zend\Mvc\Router\Http\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(
                        ),
                    ),
                ),
            ),
        ),
    ),
),

home的路由工作正常。但对于http://localhost/application我得到了:

  

索引(解析为无效的控制器类或别名:索引)

http://localhost/application/index/index我得到:

  

index(解析为无效的控制器类或别名:index)

如果我改变了这个:

'application' => array(
            'type'    => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route'    => '/application',
                'defaults' => array(
                    '__NAMESPACE__' => 'Application\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),

到此:

'application' => array(
            'type'    => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route'    => '/application',
                'defaults' => array(
                    'controller'    => 'Application\Controller\Index',
                    'action'        => 'index',
                ),
            ),

正如您对http://localhost/application所知,它会像home url

一样正常工作

如果我使用它:

    'controllers'  => array(
    'invokables' => array(
        'index'   => 'Application\Controller\IndexController',
    ),
),

如您所知,配置将合并,我应该在项目中只有一个索引控制器。

为什么忽略行'__NAMESPACE__' => 'Application\Controller',并在控制器数组中查找不存在的索引或索引?

修改

与其他项目相比,我将其添加到Application/Module.php

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

它现在有效,但我需要和解释。是解决方案吗?我的意思是我应该将其添加到项目中的Module.php个文件之一,以使路由规则正常工作吗?为什么没有它,路由规则中会忽略__NAMESPACE__

1 个答案:

答案 0 :(得分:2)

您已找到解决方案,添加ModuleRouteListener是正确的做法。可以在the description of the onRoute method inside this listener

中找到解释
  

聆听"路线" event并确定模块名称空间是否应该预先添加到控制器名称。

     

如果路由匹配包含与MODULE_NAMESPACE常量匹配的参数键,则该值将通过命名空间分隔符添加到匹配的控制器参数中。