Zend framework2 如何使用Zend Framework 2路由选择控制器命名空间?

Zend framework2 如何使用Zend Framework 2路由选择控制器命名空间?,zend-framework2,Zend Framework2,我将此作为我的DI配置的一部分,从骨架应用程序: 'routes' => array( 'default' => array( 'type' => 'Zend\Mvc\Router\Http\Segment', 'options' => array(

我将此作为我的DI配置的一部分,从骨架应用程序:

                '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(
                                'controller' => 'Application\Controller\IndexController',
                                'action'     => 'index',
                            ),
                        ),
                    ),  
我想安排以下路线:

http://me.com/mycontroller/myaction --> 
controller=Applicaiton\Controller\Mycontroller 
method=myactionAction
但是,上述配置会产生:

http://me.com/mycontroller/myaction --> 
controller=Mycontroller 
method=myactionAction

如您所见,缺少控制器的命名空间。在何处/如何放置名称空间?(我知道我可以为每个控制器创建DI别名,但这不符合分段匹配的目的。)

您不应该在路由中为控制器使用分段。段匹配可用于操作和其他参数,但不适用于控制器。您可以使用别名帮助mycontroller匹配MyNamespace\mycontroller,但不建议使用别名。最好、最简单、性能最好的方法是为每个控制器设置路由,必要时使用分段进行操作。

完全有可能实现您最初试图实现的目标。在默认情况下,您可以添加一个_名称空间_)键,并稍微更改控制器键

你可以这样做:

'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(
            '__NAMESPACE__' => 'Application\Controller',
            'controller' => 'Index',
            'action' => 'index',
        ),
    ),
),
唯一需要的其他更改是,当您将控制器注册为模块配置中的可调用控制器时,您必须这样做:

'controllers' => array(
    'invokables' => array(
        'Application\Controller\Index' => 'Application\Controller\IndexController',
    ),
),
注意我是如何在键中使用索引而不是IndexController的

在我所能找到的文档中,没有提到路由的默认定义的这个_名称空间_uu键以及在可调用数组行为的键末尾删除“Controller”。我实际上是从ZendskletionApplication的路由工作原理中收集到这些信息的:


段匹配可用于操作和其他参数,但不适用于控制器。您可以使用别名帮助
mycontroller
匹配
MyNamespace\mycontroller
,但不建议使用别名。最好、最简单、性能最好的方法是为每个控制器设置路由,必要时使用分段进行操作。确定。有道理。如果你把答案写在下面,我会接受的。