[英]Zend2 Routing __NAMESPACE__ doesn't work or be ignored
我在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
網址一樣正常工作
如果我用這個:
'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__
將在路由規則中被忽略?
您已經找到了解決方案,添加ModuleRouteListener
是正確的做法。 可以在此偵聽器中的onRoute
方法的說明中找到解釋:
偵聽“route”事件並確定模塊名稱空間是否應該添加到控制器名稱之前。
如果路由匹配包含與
MODULE_NAMESPACE
常量匹配的參數鍵,則該值將通過命名空間分隔符添加到匹配的控制器參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.