我在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__
?
答案 0 :(得分:2)
您已找到解决方案,添加ModuleRouteListener
是正确的做法。可以在the description of the onRoute
method inside this listener:
聆听"路线" event并确定模块名称空间是否应该预先添加到控制器名称。
如果路由匹配包含与
MODULE_NAMESPACE
常量匹配的参数键,则该值将通过命名空间分隔符添加到匹配的控制器参数中。