2016-08-14 44 views
2

我使用這個配置在Zend2我的應用程序模塊的配置這是非常正常的,每一個建議作爲一個標準的路由規則:Zend2路由__NAMESPACE__不工作或忽視

'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我得到:

指數(解析爲無效的控制器類或別名:索引)

如果我改變這個:

'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網址

,如果我用這個:

'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

您已經找到解決方案,添加ModuleRouteListener是正確的選擇。可以在the description of the onRoute method inside this listener中找到解釋:

收聽「路由」事件並確定是否應將模塊名稱空間添加到控制器名稱前。

如果路由匹配包含匹配MODULE_NAMESPACE常量的參數密鑰,則該值將與名稱空間分隔符一起預先添加到匹配的控制器參數中。

+0

Thx,那麼__NAMESPACE__將不會被檢查沒有使用ModuleRouteListener? –

+0

@ S.Gholizadeh沒錯 – Wilt