1

我将它作为我的 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 别名,但这会破坏进行段匹配的目的。)

4

2 回答 2

2

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

你可以这样做:

'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',
    ),
),

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

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

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

于 2013-05-28T18:32:39.183 回答
1

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

于 2012-05-09T09:44:04.890 回答