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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Zend Framework 2路由选择控制器命名空间?相关的知识,希望对你有一定的参考价值。

我将这个作为我的DI配置的一部分,来自骨架应用程序:

                'routes' => array(
                    'default' => array(
                        'type'    => 'ZendMvcRouterHttpSegment',
                        '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' => 'ApplicationControllerIndexController',
                                'action'     => 'index',
                            ),
                        ),
                    ),  

我想做以下路线:

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

但是,上面的配置会产生:

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

如您所见,缺少控制器的命名空间。在哪里/如何将命名空间放入? (我知道我可以为每个控制器制作一个DI别名,但这样做会使段匹配失败。)

答案

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

另一答案

完全有可能实现您最初想要实现的目标。在默认设置中,您可以添加__NAMESPACE__键并略微更改控制器键。

你可以做到这一点:

'default' => array(
    'type' => 'ZendMvcRouterHttpSegment',
    '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__' => 'ApplicationController',
            'controller' => 'Index',
            'action' => 'index',
        ),
    ),
),

唯一需要进行的其他更改是当您将控制器注册为模块配置中的invokable时,您必须这样做:

'controllers' => array(
    'invokables' => array(
        'ApplicationControllerIndex' => 'ApplicationControllerIndexController',
    ),
),

请注意我如何在键中使用Index而不是IndexController。

在我可以找到的文档中的任何地方都没有提到路由的默认定义的__NAMESPACE__键以及在invokables数组行为中键的末尾删除“Controller”。我实际上从ZendSkeletionApplication的路由工作中收集了这些信息:

https://github.com/zendframework/ZendSkeletonApplication/blob/2ce1cf0dd40046024970d87d3998e16cde41c7db/module/Application/config/module.config.php

以上是关于如何使用Zend Framework 2路由选择控制器命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework 2 中的路由,跳过 url 中的“索引”操作但获取 id

Zend Framework 2,使用选择

通用页面的 Zend Framework 路由?

Zend Framework:从路由获取子域参数

使用 Zend_Loader 选择不同版本的 Zend Framework 加载及其问题

如何使用Zend Framework 2使用Rest API