簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM